*What could be the strength of an earthquake (magnitude) in your location (coordinate)?*
Mijn naam is Mohamed Dira en ik wil graag een voorspellingsmodel creëren omtrent aardbevingen. Ik ben achter dit idee gekomen na de recentelijke aardbeving in Turkije, die vele levens heeft gekost. In dit Notebook zal ik de magnitude voorspellen op basis van een lengte- en breedtegraad die de gebruiker invult. De lengte- en breedtegraad geeft een gebied weer om een straal van 100 km in een visusalisatie, in waar er onder andere wordt gekeken naar aardbevingen die in het verleden zijn geweest in deze regio. Op basis van deze input-gegevens wordt de target variabele, namelijk magnitude voorspeld. De gebruiker voert alleen zijn eigen lengte- en breedtegraad in, waarmee in de applicatie uiteindelijk automatisch een gebied mee wordt berekend door de vier kolommen van minimum en maximum lengte- en breedtegraad.
Voor deze challenge maak ik gebruik van een notebook, waarin alle aardbevingen staan beschreven over de gehele wereld van 1930 tot 2018. Om te kijken of deze dataset alle informatie bevat die ik nodig heb, kijken we naar de kolommen. Voor deze challenge heb ik eigenlijk maar drie kolommen nodig, namelijk lengtegraad, breedtegraad en magnitude, welke in deze dataset te vinden is. Ook zijn er genoeg rijen in deze dataset, om een voorspelling te kunnen maken. Ik had in het begin een eis van minimaal 100.000 rijen (zie requirements). Deze dataset bevat 700.000 rijen, wat meer dan genoeg is. Deze dataset is ook actueel, waarbij deze dataset is gepubliceerd in 2022, waarbij de laatste geregistreerde aardbeving in 2018 is. De dataset zelf is overal beschikbaar. De hoofdbron van deze dataset is te vinden in Kaggle, welke een betrouwbare bron is. Kaggle heeft de informatie om deze dataset op te bouwen, gehaald uit de website van USGS, welke staat voor "U.S. Geological Survey". Dit is een officiele website van de Amerikaanse overheid, welke natuurlijke calamiteiten onderzoekt en rapporteerd. Deze dataset wordt daarnaast ook gebruikt door Harvard, om te bestuderen of aardbevingen voorspeld kunnen worden en of andere aspecten omtrent aardbevingen voorspeld kunnen worden. De dataset is dus betrouwbaar, omdat het uit betrouwbare bronnen komt (Kaggle, Harvard en USGS).
Het enige wat echt ontbreekt aan deze dataset, is de inhoud van de laatste 9 kolommen. Deze kolommen geven verdere informatie over de plaats van de aardbeving en de bron van welke instantie de aarbeving heeft geregistreerd. Ook zitten hier error kolommen bij, zoals de magnitude error, horizotale error en diepte error. Hoewel deze kolommen missen, zullen deze niet benodigd zijn voor deze challenge. Het is wel jammer dat deze kolommen missen, omdat deze gebruikt hadden kunnen worden om de data beter te begrijpen. Nog een beperking die deze dataset heeft is dat deze dataset alleen maar wel-aardbevingen bevatten. Hierdoor kan het toekomstige model geen differentiatie maken tussen plekken waar wel en plekken waar geen aardbevingen ontstaan. Hierdoor kan het model alleen magnitudes boven de 1 voorspellen in gebieden waar nooit een aardbeving is geweest. Dit is iets wat ik handmatig zal moeten toevoegen (zie requirements). Zie hieronder alle informatie, links en metadata van de dataset zelf, ge-extraheerd uit de website van Harvard.
Publication Date
2022-01-24
Title
Replication Data for: initial study on predicting earthquakes using machine learning
Author
Martins, Gustavo
Description
All earthquakes from 1930 until 2018, worldwide. Contain basic information such as location, time and magnitude.
Acknowledgements
The United States Geological Survey (USGS)
Subject
Earth and Environmental Sciences Computer and Information Science Physics
Other Reference
https://www.usgs.gov/
Data Source
https://www.usgs.gov/
Link bron
https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/UTY03A
Related Publication
https://medium.com/marionete/predicting-earthquakes-using-machine-learning-21689435dc52
U.S. Geological Survey, “Earthquakes for ML prediction.” Kaggle, 2021, doi: 10.34740/KAGGLE/DSV/2795577. doi: 10.34740/kaggle/dsv/2795577
https://www.kaggle.com/gustavobmgm/earthquakes-for-ml-prediction/metadata
Notes
The United States Geological Survey (USGS) earthquake catalog https://earthquake.usgs.gov/earthquakes/search/
Shared following instructions from here https://www.usgs.gov/products/data-and-tools/data-management/publishshare
In deze dataset zijn alle aardbevingen over de hele wereld geregistreerd van 1930 t/m 2018, waardoor deze dataset toch actueel is. De data zelf bestaat uit 21 kolommen.
De dataset zelf is een CSV bestand. Dit bestand is een bestand met kolommen die gesepareerd zijn met een scheidingsteken. Dit kan een komma, puntkomma of dubbele punt zijn. In dit bestand is het een komma. Dit bestand laad ik in met de read_csv functie van de Pandas module. Met de sep parameter zorg ik ervoor dat de scheidingsteken/delimiter van een komma wordt geregistreerd, zodat de kolommen op basis van dit teken wordt gescheiden. Zie hieronder de output van deze ingelaadde dataset.
import sklearn
import pandas as pd
import seaborn
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import geopandas as geo
from sklearn.model_selection import GridSearchCV
PQ = pd.read_csv("bronze.csv", sep = ",")
PQ
| time | latitude | longitude | depth | mag | magType | nst | gap | dmin | rms | ... | updated | place | type | horizontalError | depthError | magError | magNst | status | locationSource | magSource | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1930-12-08T08:01:02.000Z | 23.2610 | 120.2770 | 15.00 | 6.3 | mw | NaN | NaN | NaN | NaN | ... | 2015-05-13T18:52:43.000Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1 | 1930-12-03T18:51:47.000Z | 18.2330 | 96.2980 | 10.00 | 7.4 | mw | NaN | NaN | NaN | NaN | ... | 2015-05-13T18:52:43.000Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 2 | 1930-12-02T07:01:30.000Z | 25.8540 | 98.3560 | 35.00 | 6.2 | mw | NaN | NaN | NaN | NaN | ... | 2015-05-13T18:52:43.000Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 3 | 1930-11-28T07:32:56.000Z | 18.7790 | -106.7670 | 15.00 | 6.3 | mw | NaN | NaN | NaN | NaN | ... | 2015-05-13T18:52:43.000Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 4 | 1930-11-25T19:02:53.000Z | 35.0500 | 139.1290 | 15.00 | 6.9 | mw | NaN | NaN | NaN | NaN | ... | 2015-05-13T18:52:43.000Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 797041 | 2018-09-01T01:14:38.230Z | -30.4830 | -177.9279 | 43.90 | 4.3 | mb | NaN | 165.0 | 1.233 | 0.87 | ... | 2018-11-07T18:37:12.040Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 797042 | 2018-09-01T01:07:59.120Z | -10.7558 | 124.3621 | 10.00 | 4.0 | mb | NaN | 112.0 | 0.998 | 1.23 | ... | 2018-11-07T18:37:12.040Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 797043 | 2018-09-01T01:00:13.810Z | -5.5167 | 147.1735 | 217.56 | 4.6 | mb | NaN | 119.0 | 3.455 | 0.71 | ... | 2018-11-07T18:37:07.040Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 797044 | 2018-09-01T00:27:11.440Z | 46.8819 | 155.6566 | 10.00 | 4.3 | mb | NaN | 94.0 | 6.370 | 1.21 | ... | 2018-11-07T18:37:12.040Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 797045 | 2018-09-01T00:00:47.980Z | -55.7508 | -28.3561 | 10.00 | 4.8 | mb | NaN | 78.0 | 4.905 | 1.31 | ... | 2018-11-07T18:37:07.040Z | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
797046 rows × 22 columns
Hieronder zijn alle verschillende kolommen te zien, die met de info functie worden weergegeven. Zoals je kunt zien zijn de datatypen die het meeste voorkomen zowel object als float. De float datatypen geven een numerieke waarde weer in de vorm van een decimale notatie. Hierbij is de decimale notatie genoteerd met een punt en geen komma. Wat er ook veel te zien is, is de object datatype dat bij veel kolommen terugkomt. Een object wordt toegekend als een datatype van een kolom nog niet bekend is of is gedefineerd. Een object kan bijvoorbeeld een string zijn waar ook nummers in zijn gestopt. Hierdoor kan het systeem niet een definitieve datatype toekennen aan de kolom. In plaats hiervan wordt een object datatype gebruikt. Naast de datatypen is ook te zien dat kolom 13 tot 21 allemaal leeg zijn. Deze kolommen zijn door de maker van de dataset bewust leeggelaten. Dit komt door de verschillen in bronnen, die zijn samengevoegd. Doordat de data uit deze laatste kolommen bewust zijn weggelaten, spreken we hier van MCAR. Missing Completely At Random geeft weer dat de reden achter de missende data niets te maken heeft met wat er wordt geobserveerd in de dataset. Zo wordt het weglaten van data door de auteur, vanwege zijn persoonlijke keuzes niet als iets gezien dat iets te maken heeft met aardbevingen. Deze kolommen zal ik later verwijeren uit de dataset.
PQ.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 797046 entries, 0 to 797045 Data columns (total 22 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 time 797046 non-null object 1 latitude 797046 non-null float64 2 longitude 797046 non-null float64 3 depth 797041 non-null float64 4 mag 797046 non-null float64 5 magType 796940 non-null object 6 nst 421658 non-null float64 7 gap 470629 non-null float64 8 dmin 202838 non-null float64 9 rms 614095 non-null float64 10 net 797046 non-null object 11 id 797046 non-null object 12 updated 797046 non-null object 13 place 0 non-null float64 14 type 0 non-null float64 15 horizontalError 0 non-null float64 16 depthError 0 non-null float64 17 magError 0 non-null float64 18 magNst 0 non-null float64 19 status 0 non-null float64 20 locationSource 0 non-null float64 21 magSource 0 non-null float64 dtypes: float64(17), object(5) memory usage: 133.8+ MB
Zoals ik in de introductie heb beschreven, wil ik de magnitude voorspellen aan de hand van de lengte- en breedtegraad als input door de gebruiker. De target variabele is in dit geval de magnitude, oftwel kolom 'mag' in de dataset. De input features zullen de lengtegraad en breedtegraad zijn, oftewel kolom 'latitude' en 'longitude'.
Ik wil voorspellen wat de hoogte van de magnitude zal zijn op een bepaalde punt op de wereldkaart, in de vorm van een coordinaat die op de wereldkaard wordt getoond. Omdat ik de vraag stel: 'Wat is de hoogte van...', is het automatisch een regressieprobleem. Hierdoor zal ik gebruik maken van een regressiemodel. Uit diverse gesprekken met Bas ben ik eruit gekomen dat drie modellen het beste passen bij deze challenge. Deze modellen zijn de Nearest Neighbors model, welke dient als de baseline ter vergelijking van de modellen. Ook zal ik de Decision Tree gebruiken om te kijken of het gebruiken van een Tree een betere voorspelling kan maken dan het Nearest Neigbors model. Tenslotte zal ik ook gebruik maken van een Support Vector Machine model. Dit model kan goed werken met afstanden, zoals we in dit probleem doen met de lengte- en breedtegraad. Daarnaast werkt dit model goed met zowel lineaire als non-lineaire data. Deze drie modellen zal ik gebruiken in deze challenge.
De heatmap hieronder dient ter visualisatie van de verschillende (beschikbare) kolommen ten opzichte van de target variabele. De latitude geeft een negatieve relatie weer, terwijl de longitude een positieve relatie weergeeft. Dit komt dus doordat latitude voornamelijk bestaat uit negatieve waarden, terwijl longitude bestaat uit voornamelijk positieve waarden. Daarnaast is deze heatmap niet de beste optie voor deze data, omdat het de individuele correlatie weergeeft van de kolommen ten opzichte van de target variabele magnitude, terwijl de lengte- en breedtegraad een afhankelijkheid van elkaar hebben op target variabele magnitude. Daarnaast neemt de magnitude niet toe of af als de lengte- of breedtegraad toeneemt, zoals te zien is in de pairplot. Deze heatmap dient daarom alleen als inzage op de andere kolommen, dan de lengte- en breedtegraad. Deze correlatie zal later veranderen (verlagen), wanneer er dummy data toegevoegd wordt aan de dataset.
PQ = PQ[['latitude', 'longitude', 'depth', 'nst', 'gap', 'dmin', 'rms', 'mag']]
correlations = PQ.corr()
plot = seaborn.heatmap(correlations, cbar=True, annot=True, fmt=".1f")
plot = seaborn.pairplot(PQ, x_vars=PQ[['latitude', 'longitude', 'depth', 'nst', 'gap', 'dmin', 'rms']], y_vars=PQ[['mag']])
Voordat ik ga beginnen met het modelleren en visualiseren, zijn er nog een aantal punten die aangepast moeten worden in de data. Voor deze punten maak ik bepaalde eisen in hoe deze punten veranderd moeten worden en wat het eindresultaat van deze punten moet zijn. Zie hieronder de verschillende requirements die ik wil gaan aanpassen aan mijn dataset, voordat ik wil gaan beginnen met visualiseren en modelleren.
info functie)Dit zijn alle requirements die ik in mijn dataset wil gaan toepassen. De toepassingen die ik heb toegepast in mijn dataset is hieronder stap voor stap te vinden.
Hieronder plot ik alle coordinaatpunten in de vorm van een scatterplot. In de scatterplot hieronder kun je zien dat de punten specifieke vormen maken. Ze maken geen vormen als de landen op de wereldkaart, maar de punten worden gevormd naar de vormen van de tektonische platen. Om deze vormen wat beter weer te geven heb ik in de volgende plot alleen de coordinaten geplot met een magnitude van 5 of hoger, daarin zijn de punten beter weergegeven in de vormen van de tektonische platen. Het is ook logisch dat de aardbevignen meer rond de tektonische platen worden geplot, omdat rond deze platen de seismische activiteit het hoogst is. Volgens het National Oceanic and Atmospheric Administration bewegen de tektonische platen met 1,5 cm ieder jaar. Hierdoor is het ook vanzelfsprekend dat de (hevigere) aardbevingen ontstaan rond deze tektonische platen.
plt.figure(figsize=(14,7.5))
plt.scatter(y = PQ['latitude'], x = PQ['longitude'])
<matplotlib.collections.PathCollection at 0x25d3a0b7be0>
Hieronder zijn de tektonische platen beter te herkennen. Vooral de Afrikaanse, Zuid-Amerikaanse, Euraziatische, Nazca, en Indo- Australische plaat zijn het best te herkennen uit de plot hieronder. Zie de bijgevoegde afbeelding voor meer informatie over deze platen.
plt.figure(figsize=(15,7.5))
PQ_scatter = PQ.loc[PQ['mag'] >= 5]
plt.scatter(y = PQ_scatter['latitude'], x = PQ_scatter['longitude'], cmap = 'seismic', c = PQ_scatter['mag'].sort_values())
plt.colorbar(label = 'Magnitude')
<matplotlib.colorbar.Colorbar at 0x25d3a456560>
Met de basemap package maak ik een wereldmap aan met fixed coordinaten. Met de projection parmeter geef ik aan dat het op milimeter-basis moet gebeuren (schaal). Vervolgens bepaal ik met de llcrnrlat, urcrnlat, llcrnrlon en urcrnrlon parameters de grootte van de map, met een minimale en maximale lengtegraad en een minimale en maximale breedtegraad. Functie lat_ts bepaalt de breedtegraad van ware schaal, die ik voor testing purposes voor nu even op 20 heb gezet. De resolutie is "crude" (c), wat voor deze map niet te laag, maar ook niet te hoog is.
De lengte- en breedtegraden plaats ik vervolgens in twee lists. Deze lists zijn nodig om van de coordinaten namelijk grid coordinaten te maken met de basemap (m). Dit komt omdat basemap alleen grid coordinaten accepteerd, dus niet float datatype kolommen uit een pandas dataframe. Bij het plotten van de data pak ik dus de grid coordinaten die ik heb gemaakt en plaats ik deze in de x- en y-argumenten van de plot functie. Vervolgens zal de marker een "o" zijn, wat dus een cirkel is, met een markergrootte van 1 en een rode kleur. De laatste vier functies wordt gebruikt om de opmaak te wijzigen van de map. De drawcoastlines functie geeft een kleur aan de landgrenzen die grenzen aan het water. De fillcontinents geeft de continenten een kleurtje die ik voor nu even groen heb gemaakt. De drawmapboundary geeft met de fill functie een invulling op de achtergrond (water) van de map. Tenslotte zorgt drawcountries ervoor dat de lijnen worden getekend van de verschillende landen in de continent, die ik dezelfde kleur geef als de lijnen van de grenzen met het water.
Uit onderstaande plot is inderdaad te zien dat de punten van de aardbevingen vaak niet grenzend zijn aan de grenzen van de landen, maar inderdaad aan de grenzen van de tektonische platen. De meeste aardbevingen vinden zelf niet eens plaats op het landoppervlak, maar zijn vaak te ervaren aan de kust of zelfs in het midden van de zee. Vooral in het oosten zijn de hoeveelheid aardbevingen het hoogst, met ook de sterkste magnitude kracht. In de map heb ik de punten nu even geplot van hoog naar laag, waarbij de sterkere aardbevingen met een hogere magnitude boven de lagere magnitude aardbevingen worden weergegeven. Dit heb ik gedaan, omdat deze sterkere aardbevingen minder voort komen en daarom ook interessanter zijn om te onderzoeken. De punten in het oosten wordt ook wel het Ring of Fire gebied genoemd, laten we even dieper inzoomen op dit gebied hieronder.
# PQ_viz wordt de dataset dat wordt gebruikt om de aardbevingen te visualiseren en om outputs van alle aardbevingen in de visualisaties weer te geven.
PQ_viz = pd.read_csv("bronze.csv", sep = ",")
PQ_viz['time'] = PQ_viz['time'].str[:19]
PQ_viz['time'] = pd.to_datetime(PQ_viz['time'])
PQ_viz = PQ_viz[["time", "latitude", "longitude", "depth", "mag", "nst", "gap", "dmin", "rms", "net", "id", "updated"]]
from mpl_toolkits.basemap import Basemap
m = Basemap(projection='mill',llcrnrlat=-80,urcrnrlat=80, llcrnrlon=-170,urcrnrlon=190,lat_ts=20,resolution='c')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
x,y = m(longitudes,latitudes)
fig = plt.figure(figsize=(12,10))
m.scatter(x, y, s=PQ_viz["depth"].sort_values() / 200, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
m.drawcoastlines(color = '#2296ab')
m.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m.drawmapboundary(fill_color='#21AFBF')
m.drawcountries(color = '#2296ab')
m.colorbar(label = "Magnitude")
C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
<matplotlib.colorbar.Colorbar at 0x25d3a06fc10>
Er is een specifiek gebied op de wereld waar de meeste aardbevingen en volcanische uitstortingen voort komen. Dit gebied heet de Ring of Fire. Volgens 'National Geographic' vinden 90% van alle aardbevingen plaats in de Ring of Fire. In dit gebied komen ook de meest hevige aardbevingen voor, vaak met een magnitude van 5 of hoger. Dit komt doordat in dit gebied de meeste tektonische platen met elkaar ontmoeten, zoals in deze afbeelding hieronder is te zien. Als deze platen ieder jaar allemaal verschuiven, dan is het vanzelfsprekend dat in dit gebied de meeste en meest hevige aardbevingen zullen ontstaan. Het is voor mij belangrijk om te controleren of deze aardbevingen juist worden geplot in de Ring of Fire en of in deze visualisatie ook de meeste aardbevingen voort komen in dit gebied met hogere magnitudes dan andere gebieden.
Hieronder wordt het Ring of Fire geplot. Helaas heb ik er geen 1 hele map van kunnen maken. Hoewel ik de llcrnrlon en urcrnrlon parameters kan bewerken, zodat de kaart horizontaal verschuift, verschuiven te punten niet mee. Dit komt doordat de coordinaten in de dataset binnen de minimum- en maximum van de lengtegraad (-180 t/m 180) en breedtegraad (-90 t/m 90) worden weergegeven in de dataset. Door de wereldkaart te verschuiven boven de 180 of onder de -180, zullen de punten niet mee worden geplot, wat logisch is. Hierdoor heb ik twee aparte plots gemaakt die samen het Ring of Fire gebied weergeven, namelijk m en m2. Ik heb geprobeerd deze visualisaties naast elkaar te plotten met de subplot functie, maar deze retourneerd helaas twee lege plots terug, terwijl ze op dezelfde row, column, maar andere index zitten.
Uit de visualisaties zelf is duidelijk te zien dat het Ring of Fire gebied dat hierboven is weergegeven, precies zo in deze visualisatie naar voren komt. De aardbevingen zitten geplot rond de kust, vooral rond de Aziatische (oostelijke), Amerikaanse (zuid-westelijke) en Zuid-Amerikaanse (westelijke) kust.
# PQ_viz wordt de dataset dat wordt gebruikt om de aardbevingen te visualiseren en om outputs van alle aardbevingen in de visualisaties weer te geven.
PQ_viz = pd.read_csv("bronze.csv", sep = ",")
PQ_viz['time'] = PQ_viz['time'].str[:19]
PQ_viz['time'] = pd.to_datetime(PQ_viz['time'])
PQ_viz = PQ_viz[["time", "latitude", "longitude", "depth", "mag", "nst", "gap", "dmin", "rms", "net", "id", "updated"]]
from mpl_toolkits.basemap import Basemap
m = Basemap(projection='mill',llcrnrlat=-80,urcrnrlat=80, llcrnrlon=60,urcrnrlon=180,lat_ts=20,resolution='c')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
x,y = m(longitudes,latitudes)
fig = plt.figure(figsize=(12,10))
m.scatter(x, y, s=PQ_viz["depth"].sort_values() / 200, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
m.drawcoastlines(color = '#2296ab')
m.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m.drawmapboundary(fill_color='#21AFBF')
m.drawcountries(color = '#2296ab')
m2 = Basemap(projection='mill',llcrnrlat=-80,urcrnrlat=80, llcrnrlon=-180,urcrnrlon=-30, lat_ts=20,resolution='c')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
x,y = m2(longitudes,latitudes)
fig = plt.figure(figsize=(12,10))
m2.scatter(x, y, s=PQ_viz["depth"].sort_values() / 200, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
m2.drawcoastlines(color = '#2296ab')
m2.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m2.drawmapboundary(fill_color='#21AFBF')
m2.drawcountries(color = '#2296ab')
C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
<matplotlib.collections.LineCollection at 0x25d649e5090>
In de chunk hieronder probeer ik in te zoomen op een specifieke locatie. Allereerst probeer ik hierbij een aantal input variabelen aan te maken. Ik maak eerst een input variabele voor de lengte- en breedtegraad van de gebruiker. Dan bereken ik de min en max lengte- en breedtegraad, door een bepaalde getal, namelijk de 0,9 voor de 100km er bij op te tellen en eraf te trekken. Vervolgens pas ik de parameter in de basemap aan naar de minimum en maximum lengte- en breedtegraad, met dit keer een hoge resolutie ("h"). Omdat er ingezoomd moet gaan worden, is het belangrijk dat de grenzen duidelijk zijn van het land en dat deze niet afgevlakt worden. De rest van de code blijft eigenlijk hetzelfde als wat hierboven gemaakt is, namelijk het plotten van de aardbevingscoordinaten en het opmaken van de map. Wel heb ik hier de marker en markersize aangepase naar een kruisje, om het zo visueel aantrekkelijk te maken. Ik heb hieronder eerst mijn huidige locatie (Eindhoven) geplot, waar uiteraard nauwelijks aardbevingen te zien zijn. Eindhoven is namelijk geen seismisch actief gebied. Daarnaast bevindt Eindhoven zich ook midden in de Euraziatische plaat en dus niet aan de grens, waardoor de kans op (sterke) aardbevingen minimaal tot nihil is. Vervolgens heb ik de coordinaten van Nagasaki, Japan geplot, wat een seismisch actief gebied is. Zie de plots hieronder. De maps hieronder is wat de gebruiker te zien krijgt met daarbij ook een dataset view van de aardbevingen.
#Map Eindhoven, Nederland
from mpl_toolkits.basemap import Basemap
user_coord_latitude = 51.4392648
user_coord_longitude = 5.478633
user_coord_longitude_min = user_coord_longitude - 0.9
user_coord_longitude_max = user_coord_longitude + 0.9
user_coord_latitude_min = user_coord_latitude - 0.9
user_coord_latitude_max = user_coord_latitude + 0.9
m = Basemap(projection='mill', llcrnrlat=user_coord_latitude_min,
urcrnrlat=user_coord_latitude_max,
llcrnrlon=user_coord_longitude_min,
urcrnrlon=user_coord_longitude_max, resolution='h')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
x,y = m(longitudes,latitudes)
fig = plt.figure(figsize=(12,10))
m.drawcoastlines(color = '#2296ab')
m.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m.drawmapboundary(fill_color='#21AFBF')
m.drawcountries(color = '#2296ab')
m.scatter(x, y, marker = "x", s=PQ_viz["depth"].sort_values()/8, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
xpt,ypt = m(user_coord_longitude,user_coord_latitude)
m.plot(xpt,ypt,'#ad3034', marker = 'v')
plt.text(xpt-11000,ypt+4000,'Your location')
m.colorbar(label = "Magnitude")
C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
<matplotlib.colorbar.Colorbar at 0x25d075056c0>
Hieronder is de output dataset te zien van de verschillende punten op de map hierboven van Eindhoven, Nederland met een straal van 100km. Dit doe ik door met de loc functie te filteren op rijen tussen de minimale en maximale lengtegraad. Hetzelfde doe ik door te filteren tussen de minimale en maximale breedtegraad. Met de between functie, kan er gefilterd worden tussen twee numerieke waarden. Het is de bedoeling dat deze output dataset wordt getoond in de applicatie. Zoals je kunt zien zijn er hierboven 139 aardbevingen geplot, zoals te zien is in de dataset hieronder. De gebruiker krijgt naast de map deze dataset te zien met daarbij de datum/tijd, coordinaten, diepte en magnitude.
output_dataset = PQ_viz.loc[(PQ_viz['latitude'].between(user_coord_latitude_min, user_coord_latitude_max))]
output_dataset = output_dataset.loc[(output_dataset['longitude'].between(user_coord_longitude_min, user_coord_longitude_max))]
output_dataset['id'] = range(1, output_dataset['time'].count() + 1)
output_dataset = output_dataset[["id", "time", "latitude", "longitude", "depth", "mag"]]
output_dataset
| id | time | latitude | longitude | depth | mag | |
|---|---|---|---|---|---|---|
| 36363 | 1 | 1975-06-21 16:49:51 | 50.8350 | 6.012 | 28.0 | 3.2 |
| 55027 | 2 | 1978-06-10 13:58:20 | 50.5840 | 6.072 | 14.0 | 3.1 |
| 85647 | 3 | 1982-05-22 06:00:00 | 51.1150 | 5.801 | 10.0 | 3.8 |
| 87337 | 4 | 1982-03-02 01:27:26 | 51.0050 | 5.911 | 10.0 | 3.8 |
| 89837 | 5 | 1983-11-08 02:13:21 | 50.5870 | 5.387 | 8.4 | 3.6 |
| ... | ... | ... | ... | ... | ... | ... |
| 546944 | 135 | 2008-07-12 17:47:18 | 50.6440 | 4.595 | 2.0 | 2.7 |
| 547397 | 136 | 2008-07-07 15:48:33 | 50.8000 | 5.589 | 10.0 | 2.8 |
| 606774 | 137 | 2011-09-08 19:02:50 | 51.6830 | 6.025 | 6.0 | 4.2 |
| 639456 | 138 | 2013-01-20 18:26:31 | 51.1480 | 5.900 | 10.0 | 2.9 |
| 772762 | 139 | 2018-05-25 22:43:25 | 51.1375 | 5.565 | 10.0 | 2.9 |
139 rows × 6 columns
Uit nieuwsgierigheid heb ik ook de coordinaten geplot van Nagasaki, Japan. Dit zie je in de basemap hieronder. Het principe is eigenlijk hetzelfde als van die van Eindhoven, Nederland. Alleen verander ik hierbij de user-inputs van coordinaten. Hierdoor worden de min en max lengte- en breedtegraadpunten waarop de map is gebaseerd ook veranderd naar een straal van 100 km rondom de user-input. Op de map zijn er veel aardbevingen te vinden, waarbij de kruisjes ook groter zijn. Dit betekent dus dat er meer, maar ook sterkere aardbevingen plaatsvinden in Japan, dan in bijvoorbeeld Eindhoven wat ik dus al dacht. Zie hieronder de dataset-output van de aardbevingen.
# Map Nagasaki, Japan
user_coord_latitude = 32.764233
user_coord_longitude = 129.872696
user_coord_longitude_min = user_coord_longitude - 0.9
user_coord_longitude_max = user_coord_longitude + 0.9
user_coord_latitude_min = user_coord_latitude - 0.9
user_coord_latitude_max = user_coord_latitude + 0.9
m = Basemap(projection='mill', llcrnrlat=user_coord_latitude_min,
urcrnrlat=user_coord_latitude_max,
llcrnrlon=user_coord_longitude_min,
urcrnrlon=user_coord_longitude_max, resolution='h')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
x,y = m(longitudes,latitudes)
fig = plt.figure(figsize=(12,10))
m.drawcoastlines(color = '#2296ab')
m.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m.drawmapboundary(fill_color='#21AFBF')
m.drawcountries(color = '#2296ab')
m.scatter(x, y, marker = "x", s=PQ_viz["depth"].sort_values()/8, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
xpt,ypt = m(user_coord_longitude,user_coord_latitude)
m.plot(xpt,ypt,'#ad3034', marker = 'v')
plt.text(xpt-11000,ypt+4000,'Your location')
m.colorbar(label = "Magnitude")
C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
<matplotlib.colorbar.Colorbar at 0x25d0faf0880>
Hetzelfde wat ik voor Eindhoven heb gedaan, heb ik ook voor de map hierboven gedaan. In de plot hierboven zijn er dit keer 142 aardbevingen geplot. De hoeveelheid is wel ongeveer hetzelfde alleen is de sterkte veel hoger. De aardbevingen in Japan hebbben vaak eeen magnitude van 4 of hoger, terwijl bij Eindhoven een magnitude van 4 eigenlijk wel de maximum is. Als we specifiek kijken naar Japan, dan zijn de aardbevingen voornamelijk gericht aan de oostelijke kant van Japan ten opzichte van de zuid-westelijke kant, waar Nagasaki is gevestigd. Ik ben benieuwd hoe het precies eruit zou zien aan de oostelijke kant van Japan, daarom zal ik deze hieronder nog even plotten.
output_dataset = PQ_viz.loc[(PQ_viz['latitude'].between(user_coord_latitude_min, user_coord_latitude_max))]
output_dataset = output_dataset.loc[(output_dataset['longitude'].between(user_coord_longitude_min, user_coord_longitude_max))]
output_dataset['id'] = range(1, output_dataset['time'].count() + 1)
output_dataset = output_dataset[["id", "time", "latitude", "longitude", "depth", "mag"]]
output_dataset
| id | time | latitude | longitude | depth | mag | |
|---|---|---|---|---|---|---|
| 18105 | 1 | 1968-02-21 01:44:54 | 32.0660 | 130.7120 | 10.00 | 6.2 |
| 22359 | 2 | 1973-11-18 15:53:03 | 31.8820 | 129.2260 | 45.00 | 4.6 |
| 23329 | 3 | 1973-09-01 20:37:24 | 33.5020 | 130.5670 | 18.00 | 4.8 |
| 23823 | 4 | 1973-07-26 14:45:46 | 32.0180 | 130.6660 | 89.00 | 4.0 |
| 31437 | 5 | 1974-03-26 05:09:16 | 32.6470 | 130.3660 | 32.00 | 4.3 |
| ... | ... | ... | ... | ... | ... | ... |
| 774668 | 138 | 2018-05-06 12:13:21 | 32.8295 | 130.6290 | 22.10 | 4.4 |
| 776202 | 139 | 2018-08-22 09:23:39 | 32.7493 | 130.6459 | 10.00 | 4.5 |
| 784737 | 140 | 2018-07-13 08:19:36 | 32.0106 | 129.0367 | 18.52 | 4.5 |
| 786086 | 141 | 2018-07-08 18:53:06 | 33.1756 | 130.1726 | 10.00 | 4.4 |
| 793802 | 142 | 2018-10-15 00:12:55 | 32.6162 | 130.6042 | 10.00 | 4.5 |
142 rows × 6 columns
Hieronder heb ik de stad Sendai genomen om te kijken hoe seismisch een stad aan de westelijke kant van Japan wordt gevisualiseerd volgens mijn dataset. Zoals hieronder in de map te zien is zijn er veel meer en veel krachtigere aardbevingen te zien aan de westelijke kant van Japan. Dit komt doordat het westelijke deel van Japan gevestigd is op de grenzen van de Indo-Australische en Pacifische platen, welke regelmatig zowel horizontaal als verticaal bewegen. Hierdoor is dit gebied vatbaarder voor aardbevingen. In de dataset hieronder is precies weergegeven waar en wanneer een aardbeving was en wat de sterkte en diepte hiervan was.
# Map Sendai, Japan
user_coord_latitude = 38.268223
user_coord_longitude = 140.869415
user_coord_longitude_min = user_coord_longitude - 0.9
user_coord_longitude_max = user_coord_longitude + 0.9
user_coord_latitude_min = user_coord_latitude - 0.9
user_coord_latitude_max = user_coord_latitude + 0.9
m = Basemap(projection='mill', llcrnrlat=user_coord_latitude_min,
urcrnrlat=user_coord_latitude_max,
llcrnrlon=user_coord_longitude_min,
urcrnrlon=user_coord_longitude_max, resolution='h')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
x,y = m(longitudes,latitudes)
fig = plt.figure(figsize=(12,10))
m.drawcoastlines(color = '#2296ab')
m.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m.drawmapboundary(fill_color='#21AFBF')
m.drawcountries(color = '#2296ab')
m.scatter(x, y, marker = "x", s=PQ_viz["depth"].sort_values()/8, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
xpt,ypt = m(user_coord_longitude,user_coord_latitude)
m.plot(xpt,ypt,'#ad3034', marker = 'v')
plt.text(xpt-11000,ypt+4000,'Your location')
m.colorbar(label = "Magnitude")
C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
<matplotlib.colorbar.Colorbar at 0x25d658f5510>
In de dataset hieronder is een totaal van 839 aardbevingen te zien in een straal van 100 km rondom Sendai. Dit is een grote toename in vergelijking met de stad Nagasaki. De sterktes van deze aardbeving zijn ook veel hoger, met nu een algemene magnitude van vaak 5 of hoger, waarbij in sommige gevallen een magnitude van 4 of lager zijn geregistreerd. Maar deze gevallen zijn in verhouding tot de meerderheid van sterke magnitudes maar klein. Ook zijn er rode kruisjes te zien in de visualisatie, wat een aardbeving van 7.5 of hoger betekend, iets wat in Nagasaki of Eindhoven nog niet geregistreerd is.
output_dataset = PQ_viz.loc[(PQ_viz['latitude'].between(user_coord_latitude_min, user_coord_latitude_max))]
output_dataset = output_dataset.loc[(output_dataset['longitude'].between(user_coord_longitude_min, user_coord_longitude_max))]
output_dataset['id'] = range(1, output_dataset['time'].count() + 1)
output_dataset = output_dataset[["id", "time", "latitude", "longitude", "depth", "mag"]]
output_dataset
| id | time | latitude | longitude | depth | mag | |
|---|---|---|---|---|---|---|
| 1363 | 1 | 1934-04-06 19:09:35 | 37.4020 | 141.3340 | 35.00 | 5.9 |
| 10958 | 2 | 1956-09-29 21:20:52 | 37.9950 | 140.6470 | 15.00 | 5.9 |
| 11589 | 3 | 1957-10-31 02:36:58 | 37.6090 | 141.0020 | 65.00 | 5.4 |
| 14547 | 4 | 1962-04-30 02:26:24 | 38.7370 | 141.1980 | 15.00 | 6.1 |
| 18101 | 5 | 1968-02-25 20:00:32 | 37.5860 | 141.6500 | 65.50 | 5.6 |
| ... | ... | ... | ... | ... | ... | ... |
| 793328 | 889 | 2018-10-20 20:13:37 | 37.8889 | 141.6910 | 54.44 | 4.3 |
| 794617 | 890 | 2018-10-02 10:25:28 | 37.6683 | 141.7129 | 35.00 | 4.6 |
| 795665 | 891 | 2018-09-18 16:21:49 | 38.4621 | 141.5577 | 56.52 | 5.1 |
| 796281 | 892 | 2018-09-10 19:27:29 | 37.7960 | 141.0925 | 65.42 | 4.3 |
| 796381 | 893 | 2018-09-09 11:37:54 | 39.0220 | 141.0916 | 99.86 | 4.4 |
893 rows × 6 columns
Ik denk dat ik voor het onderdeel "Data Understanding" momenteel genoeg begrijp over de data waar ik mee wil gaan werken. Ik weet waar een coordinaat uit bestaat, hoe de magnitude is opgebouwd en wat de min/max schaal hiervan is en waar de meeste aardbevingen/sterkste aardbevingen ontstaan. Ook weet ik nu dat er een specifieke patroon te volgen is aan de hand van de punten die worden geplot. Deze nemen namelijk de grenzen van de tektonische platen over, waardoor het al snel duidelijk is in welke algemene regio's een aardbeving ontstaat en zal ontstaan. Het 'wanneer' principe van een aardbeving is tot het heden nog niet te voorspellen. Hierdoor zal ik in deze challenge alleen maar de mogelijke magnitude voorspellen in een bepaalde regio van de gebruiker.
Omdat ik al in het begin bij 'Analytic Approach' had beschreven dat de lengte- en breedtegraad mijn input features zijn en de magnitude mijn target variabele is, wil ik deze enkel behouden in mijn uiteindelijke dataset. Hierdoor zijn dit de enige kolommen die ik behoud in dataset PQ.
PQ = PQ[["latitude", "longitude", "mag"]]
Het is uiteindelijk ook de bedoeling dat kolommen "country" en "city" worden aangemaakt. Deze kolommen dienen als een soort begrenzing. Als de gebruiker bijvoorbeeld de lengte en breedtegraadpunten van "Eindhoven" invoert met een jaar en maand, dan kan het al snel zijn dat het model gaat voorspellen dat er een magnitude van 2-3 kan ontstaan in Eindhoven. Dit is natuurlijk niet de bedoeling, omdat er nooit eerder een aardbeving is gemeten in Eindhoven. Dit komt doordat er geen begrenzing is in het model, dat zegt dat deze coordinaten bij deze regio/stad/land/etc. horen. Het model kijkt naar de lengte- en breedtegraad en ziet dat de coordinaten van Eindhoven wel erg dicht in de buurt komen dan die van "Groningen", wat ook logisch is. In Groningen zijn er wel geregeld aardbevingen gemeten van tussen de 2 en 4 magnitude op de schaal van Richter. Hierdoor is het model sneller geneigd om een magnitude te voorspellen aan de hand van deze coordinaten. Met het toevoegen van land en stad als input features wil ik dit dus voorkomen.
Ik heb hieronder een test gemaakt met de Nominatim module van geopy. Het converteren van een lengte- en breedtegraad naar een locatie heet reverse geocoding. Ik heb dit met zowel een Google API geprobeerd met de GoogleV3 module naast de module van Nominatim. Het probleem bij Google, is dat je een API-key nodig hebt, die je alleen kunt verkrijgen bij het verschaffen van de creditcard gegevens, die ik niet heb. Hierdoor heb ik gebruik gemaakt van de Nominatim module, omdat een key hier niet benodigd is. Wat ik hier doe is het maken van een variabele genaamd 'test', waarin ik hetzelfde inlaad als wat ik hiervoor heb gedaan. Ik laad Nominatim en Ratelimiter in De ratelimiter is bedoeld voor het gebruiken van meer dan 1 requests van de Nominatim API. Een ratelimiter zorgt ervoor dat er een tussenpoos is tussen requests, zodat reverse geocoding voldoet aan de limiet van 1 request per seconde. Waar ik vooral tegenaan ben gelopen is de limieten die zowel Google API als Nominatim stelt aan de requests. Requests moeten 1 request per seconde zijn. Batch requests zijn niet toegestaan, vandaar dat ik ook maar 1 sample test. Ook is er een limiet van 1000 requests per dag bij dezelfde IP-adres. Dit maakt het voor mij enorm gecompliceerd om de coordinaten te reverse geocoden.
Hoewel het interessant was om een test uit te voeren, denk ik toch niet dat ik gebruik zal maken van een stad en land als mogelijke features voor het model. Dit komt doordat de relatie van de steden en landen minimaal zijn ten opzichte van de target variabele 'magnitude'. Hierdoor is het niet verstandig om deze te implementeren als features, omdat het ruis kan veroorzaken en daarmee de precisie kan laten afnemen van het model. Daarom blijf ik bij de lengte- en breedtegraad als input variabelen en de magnitude als target variabele.
test = pd.read_csv("bronze.csv", sep = ",")
test = test.sample(1, random_state=100)
test['time'] = test['time'].str[:19]
test['time'] = pd.to_datetime(test['time'])
test['year'] = test['time'].dt.year
test['month'] = test['time'].dt.month
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
geolocator = Nominatim(user_agent="geoapi") #User agent is benodigd bij gebruik van API. Dit kan van alles zijn, zelfs '1234'.
reverse = RateLimiter(geolocator.reverse, min_delay_seconds=2) #In variabele reverse plaats ik de geolocator.reverse functie, wat zorgt voor reverse geocoding.
#Een delay wordt ontwikkeld door de Ratelimiter functie met als parameter de delay in 2 seconden.
def get_city(df, geolocator, lat_field, lon_field):
location = reverse((df[lat_field], df[lon_field]), language='en')
return location.raw['address']['city']
#Een user function wordt ontwikkeld, genaamd 'get_city', met als argumenten de dataset, de geolocator, de lengtegraad en breedtegraad.
#In de 'location' variabele worden de input lengte- en breedtegraad geplaatst. De language argument zorgt ervoor dat de output stad/land wordt weergegeven in Engelse taal.
#Variabele 'address' is opgeslagen in een dictionary variabele. Met indexing neem ik de 'city' variabele en retourneer ik deze in de get_city() functie.
def get_country(df, geolocator, lat_field, lon_field):
location = reverse((df[lat_field], df[lon_field]), language='en')
return location.raw['address']['country']
#Hetzelfde doe ik hierboven met dit keer een andere index, namelijk 'country' in plaats van 'city'.
test['city'] = test.apply(get_city, axis=1, geolocator=geolocator, lat_field='latitude', lon_field='longitude')
test['country'] = test.apply(get_country, axis=1, geolocator=geolocator, lat_field='latitude', lon_field='longitude')
#Hier maak ik gebruik van de twee user functies die ik in twee nieuwe kolommen plaats, genaamd 'city' en 'country'.
#De apply function zorgt ervoor dat de functie wordt toegepast op de gehele dataframe, omdat de inputwaarden van lat_field en long_field dataframes zijn.
#Met de axis argument wordt ervoor gezorgd dat in de kolommen worden gezocht.
#De geolocator is de gestelde geolocator met user agent. en de lat_field en long_field zijn de lengte- en breedtegraadpunten uit test.
test = test[["year", "month", "latitude", "longitude", "city", "country", "depth", "mag", "nst", "gap", "dmin", "rms", "net", "id", "updated"]] #Selecteren van gewenste kolommen.
test
| year | month | latitude | longitude | city | country | depth | mag | nst | gap | dmin | rms | net | id | updated | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 134351 | 1987 | 6 | 34.123 | -117.439 | Fontana | United States | 6.091 | 2.91 | 0.0 | 34.4 | NaN | 0.092 | ci | ci724912 | 2016-02-04T01:33:51.270Z |
In de cel hieronder maak ik een dummy dataset aan, waarin per iedere coordinaat een magnitude wordt gekoppeld van 0. Wat ik eigenlijk hieronder doe is het aanmaken van 4 vaste variabelen, om de minumum en maximum lengte en breedtegraad in op te slaan. Deze minimum en maximum lengte- en breetegraad zijn de maximale lengte- en breedtegraadpunten die een wereldkaart heeft. Vervolgens maak ik twee for loops aan, die een array aanmaken. Deze for loops itereren door de minimum en maximum waarden met de arrange functie van Numphy. Met deze functie worden tussen de minimale en maximale waarden waarden geitereerd die beginnen bij de minimum waarde en steeds met 0.5 graden toeneemt totdat het maximum wordt bereikt. Deze arrays worden opgeslagen in variabelen 'latitude' en 'longitude'. Vervolgens gebruik ik de meshgrid functie van Numphy. Deze functie zorgt ervoor dat alle combinaties worden aangemaakt tussen de twee arrays. Bij 'latitude' worden er met de for loop 360 rijen gegenereerd en met 'longitude' 720 rijen. Deze waarden vermenigvuldigd zijn 259.200 rijen die met de meshgrid functie worden aangemaakt. Met de reshape functie zorg ik ervoor dat de array tweedimensionaal blijft. De T functie zorgt ervoor dat de array wordt getransponeerd, dat wilt zeggen dat het wordt veranderd in een lange horizontale array naar een lange verticale array. Deze array sla ik op in 'dum', die wordt veranderd naar een dataframe. De kolommen van deze dataframe worden van 0 en 1 veranderd naar 'latitude' en longitude. Vervolgens wordt er een magnitude gekoppeld van 0.
In het overleg met Bas kwam er uit dat het toch verstandiger was om niet-aardbevingen toe te voegen, omdat het niet de bedoeling is met de huidige dataset met alleen wel-aardbevingen, dat een magnitude wordt voorspeld in een gebied waar nooit een aardbeving is ontstaan. Dit voorkom ik door deze dummy data toe te voegen. Ik heb gekozen van 0.5 als interval, wat ongeveer 50 km is. Dit zorgt er namelijk voor dat er genoeg punten worden toegevoegd aan de dataset, waarbij er wordt voorkomen dat de dataset vol staat met dummy data. Zie hieronder de output, deze output zal ik samenvoegen met de originele PQ dataset.
minlatitude = -90
maxlatitude = 90
minlongitude = -180
maxlongitude = 180
latitude = [i for i in np.arange(minlatitude,maxlatitude, 0.5)]
longitude = [i for i in np.arange(minlongitude,maxlongitude, 0.5)]
dum = np.array(np.meshgrid(latitude, longitude)).T.reshape(-1,2)
dum = pd.DataFrame(dum)
dum.rename(columns = {dum.columns[0]:'latitude', dum.columns[1]:'longitude'}, inplace = True)
dum['mag'] = 0
dum
| latitude | longitude | mag | |
|---|---|---|---|
| 0 | -90.0 | -180.0 | 0 |
| 1 | -90.0 | -179.5 | 0 |
| 2 | -90.0 | -179.0 | 0 |
| 3 | -90.0 | -178.5 | 0 |
| 4 | -90.0 | -178.0 | 0 |
| ... | ... | ... | ... |
| 259195 | 89.5 | 177.5 | 0 |
| 259196 | 89.5 | 178.0 | 0 |
| 259197 | 89.5 | 178.5 | 0 |
| 259198 | 89.5 | 179.0 | 0 |
| 259199 | 89.5 | 179.5 | 0 |
259200 rows × 3 columns
Hieronder heb ik de punten erbij geplot boven op de wereldkaart die ik eerder bij het kopje 'Data Understanding' heb aangemaakt. Zoals je kunt zien op de map hieronder zijn er lijnen te zien, die in werkelijkheid punten zijn, die zo klein zijn dat ze worden getoond als lijnen. In de volgende cel, zal ik inzoomen op deze map, om te zien waar de punten worden geplot. Dan is ook meteen te zien dat er een probleempje zal ontstaan bij een punt waar zowel dummy als werkelijke data op worden geplot. Tenslotte weet ik dat dit onderdeel hoort bij 'Data Understanding', omdat ik hiermee de dummy data wat beter probeer te begrijpen, samen met de werkelijke data. Maar omdat ik de dummy dataset pas aanmaak in 'Data Provisioning', is het alleen maar mogelijk om deze visualisaties ook aan te maken in 'Data Provisioning'.
m = Basemap(projection='mill',llcrnrlat=-90,urcrnrlat=90, llcrnrlon=-180,urcrnrlon=180,lat_ts=20,resolution='c')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
longitudes2 = dum["longitude"].tolist()
latitudes2 = dum["latitude"].tolist()
x,y = m(longitudes,latitudes)
x2,y2 = m(longitudes2,latitudes2)
fig = plt.figure(figsize=(12,10))
m.drawcoastlines(color = '#2296ab')
m.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m.drawmapboundary(fill_color='#21AFBF')
m.drawcountries(color = '#2296ab')
m.scatter(x2, y2, s = 0.01, color = 'black') # Hier worden de dummy datapunten toegevoegd.
m.scatter(x, y, s=PQ_viz["depth"].sort_values() / 200, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
m.colorbar(label = "Magnitude")
C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
<matplotlib.colorbar.Colorbar at 0x25d6aa70e20>
Hieronder zoom ik op de wereldkaart hierboven in weer op de stad van Sendai. Zoals je kunt zien zijn de punten van de aardbevingen zichtbaar, maar ook dikkere zwarte punten. Deze zwarte punten zijn de punten van de dummy dataset. Deze punten zijn geplot tussen de punten van de werkelijke dataset. Dit zorgt voor ruis als het model zou voorspellen of dit gebied nu een seismisch gebied is of een gebied waar geen aardbevingen voortkomen oftwel magnitude '0'. Hoewel dit probleem niet zo groot zal zijn, omdat de punten van de aardbeving de punten van de dummy-dataset overtreffen, blijft dit toch een probleem dat op zijn minst opgelost moet kunnen worden. Dit probleem zal ik hieronder proberen op te lossen.
user_coord_latitude = 38.268223
user_coord_longitude = 140.869415
user_coord_longitude_min = user_coord_longitude - 0.9
user_coord_longitude_max = user_coord_longitude + 0.9
user_coord_latitude_min = user_coord_latitude - 0.9
user_coord_latitude_max = user_coord_latitude + 0.9
m = Basemap(projection='mill', llcrnrlat=user_coord_latitude_min,
urcrnrlat=user_coord_latitude_max,
llcrnrlon=user_coord_longitude_min,
urcrnrlon=user_coord_longitude_max, resolution='h')
longitudes = PQ_viz["longitude"].tolist()
latitudes = PQ_viz["latitude"].tolist()
longitudes2 = dum["longitude"].tolist()
latitudes2 = dum["latitude"].tolist()
x,y = m(longitudes,latitudes)
x2,y2 = m(longitudes2,latitudes2)
fig = plt.figure(figsize=(12,10))
m.drawcoastlines(color = '#2296ab')
m.fillcontinents(color='#D4D93D',lake_color='#21AFBF')
m.drawmapboundary(fill_color='#21AFBF')
m.drawcountries(color = '#2296ab')
m.scatter(x2, y2, s = 10, color = 'black') # Hier worden de dummy datapunten toegevoegd.
m.scatter(x, y, marker = 'x', s=PQ_viz["depth"].sort_values() / 8, c=PQ_viz["mag"].sort_values(), cmap="seismic", alpha=0.9)
m.colorbar(label = "Magnitude")
C:\Users\Laptop\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\collections.py:967: RuntimeWarning: invalid value encountered in sqrt scale = np.sqrt(self._sizes) * dpi / 72.0 * self._factor
<matplotlib.colorbar.Colorbar at 0x25d11ff8e80>
Mijn plan is om weer een straal te introduceren in deze dataset, met als doel om de punten van de dummy dataset alleen toe te voegen aan de PQ-dataset, als deze punten NIET vallen binnen de 100km straal van de punten van de aardbevingen. Hierdoor wordt er een grens van een dikte van plusminus 50 km getrokken om de punten van de aardbevingen in dataset PQ. Hierdoor kan het model makkelijker differentieren in een gebied dat wel seismisch is en een gebied dat niet seismisch is, waardoor het ook precieser zal zijn met de voorspelling. Ik begin hieronder allereerst met het maken van een radius van 100km, waarbij 1 km gelijk staat aan 0.009 degrees. Dit is de radius die ik zal gebruiken voor de samenvoeging met de dummy dataset.
PQ['lat_min_100km'] = PQ['latitude'] - 0.9
PQ['lat_max_100km'] = PQ['latitude'] + 0.9
PQ['lon_min_100km'] = PQ['longitude'] - 0.9
PQ['lon_max_100km'] = PQ['longitude'] + 0.9
PQ
C:\Users\Laptop\AppData\Local\Temp\ipykernel_17308\3804010845.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy PQ['lat_min_100km'] = PQ['latitude'] - 0.9 C:\Users\Laptop\AppData\Local\Temp\ipykernel_17308\3804010845.py:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy PQ['lat_max_100km'] = PQ['latitude'] + 0.9 C:\Users\Laptop\AppData\Local\Temp\ipykernel_17308\3804010845.py:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy PQ['lon_min_100km'] = PQ['longitude'] - 0.9 C:\Users\Laptop\AppData\Local\Temp\ipykernel_17308\3804010845.py:4: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy PQ['lon_max_100km'] = PQ['longitude'] + 0.9
| latitude | longitude | mag | lat_min_100km | lat_max_100km | lon_min_100km | lon_max_100km | |
|---|---|---|---|---|---|---|---|
| 0 | 23.2610 | 120.2770 | 6.3 | 22.3610 | 24.1610 | 119.3770 | 121.1770 |
| 1 | 18.2330 | 96.2980 | 7.4 | 17.3330 | 19.1330 | 95.3980 | 97.1980 |
| 2 | 25.8540 | 98.3560 | 6.2 | 24.9540 | 26.7540 | 97.4560 | 99.2560 |
| 3 | 18.7790 | -106.7670 | 6.3 | 17.8790 | 19.6790 | -107.6670 | -105.8670 |
| 4 | 35.0500 | 139.1290 | 6.9 | 34.1500 | 35.9500 | 138.2290 | 140.0290 |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 797041 | -30.4830 | -177.9279 | 4.3 | -31.3830 | -29.5830 | -178.8279 | -177.0279 |
| 797042 | -10.7558 | 124.3621 | 4.0 | -11.6558 | -9.8558 | 123.4621 | 125.2621 |
| 797043 | -5.5167 | 147.1735 | 4.6 | -6.4167 | -4.6167 | 146.2735 | 148.0735 |
| 797044 | 46.8819 | 155.6566 | 4.3 | 45.9819 | 47.7819 | 154.7566 | 156.5566 |
| 797045 | -55.7508 | -28.3561 | 4.8 | -56.6508 | -54.8508 | -29.2561 | -27.4561 |
797046 rows × 7 columns
Het is de bedoeling dat de datapunten in de dummy dataset die tussen de min en max latitude EN longitude zitten van PQ, niet worden samengevoegd in de uiteindelijke PQ dataset. Ik heb het hieronder met een SQL query geprobeerd, omdat het in Python niet mogelijk is om op meerdere condities te joinen en om daarbij te joinen tussen waarden uit andere dataframes. Dit is de reden waarom ik gebruik heb gemaakt van de SQL query hieronder die ik zelf geschreven heb. De query die ik hieronder heb uitgevoerd duurt te lang, met minimaal 50 minuten runtime. En omdat ik geen andere methode heb kunnen vinden, ben ik er uiteindelijk mee gestopt. Wat deze query eigenlijk doet, is het tonen van de 'latitude', 'longitude' en 'mag' uit dataset 'dum', waarbij de coordinaten uit 'dum' worden weergegeven die lager zijn dan de minimum breedtegraad en lengtegraad, hoger zijn dan de maximum breedtegraad en lengtegraad, oftewel de coordinaten die niet binnen de radiussen zitten van de coordinaten uit PQ. Deze query heb ik ook uit proberen te voeren in mijn persoonlijke omgeving van Microsoft SQL Server, maar daar duurde het helaas ook te lang.
Wat ik nu zal doen is de datapunten uit de dummy dataset gewoon toevoegen aan de datapunten van PQ. Ik had het hier ook met Bas over gehad. En hoewel er maar een kleine hoeveelheid punten in de buurt zullen zijn van een seismisch actief gebied, ten opzichte van de werkelijke wel-aardbevingen, zullen deze punten een minimale ruis veroorzaken in de dataset. In een seismisch actief gebied zullen de wel-aardbevingen die ene punt van de niet-aardbevingen in de dummy dataset overtreffen, waardoor het model eerder een wel-aardbeving zal voorspellen dan een niet-aardbeving.
#import sqlite3
#conn = sqlite3.connect(':memory:')
#PQ.to_sql('PQ', conn, index=False)
#dum.to_sql('dum', conn, index=False)
#sqlcode = '''
#SELECT *
#FROM dum
#WHERE EXISTS
#(
# SELECT *
# FROM PQ
# WHERE dum.latitude < PQ.lat_min_100km
# AND dum.latitude > PQ.lat_max_100km
# AND dum.longitude < PQ.lon_min_100km
# AND dum.longitude > PQ.lon_max_100km
#)
#'''
#PQ = pd.read_sql_query(sqlcode, conn)
#PQ
Ik maak hieronder gebruik van de concat functie. De concat functie is snel, efficient en makkelijk om te gebruiken. Hierbij worden de waarden uit PQ en dum samengevoegd. Hierbij moet ik wel de radiuskolommen eerst verwijderen, daarna voeg ik de dataframes samen. Op een axis van '0', wordt er gekeken naar de rijen die worden samengevoegd. Vervolgens sorteer ik de waarden van laag naar hoog met betrekking tot de lengte- en breedtegraad, om de zowel de niet- als wel-aardbevingen te tonen in de output-dataset. Deze dataset zal gebruikt worden als input dataset voor het model.
PQ = PQ[['latitude', 'longitude', 'mag']]
PQ = pd.concat([PQ, dum], axis=0)
PQ = PQ.sort_values(by = ['latitude', 'longitude'])
PQ
| latitude | longitude | mag | |
|---|---|---|---|
| 0 | -90.0 | -180.0 | 0.0 |
| 1 | -90.0 | -179.5 | 0.0 |
| 2 | -90.0 | -179.0 | 0.0 |
| 3 | -90.0 | -178.5 | 0.0 |
| 4 | -90.0 | -178.0 | 0.0 |
| ... | ... | ... | ... |
| 259195 | 89.5 | 177.5 | 0.0 |
| 259196 | 89.5 | 178.0 | 0.0 |
| 259197 | 89.5 | 178.5 | 0.0 |
| 259198 | 89.5 | 179.0 | 0.0 |
| 259199 | 89.5 | 179.5 | 0.0 |
1056246 rows × 3 columns
De features die ik dus zal gebruiken zijn de latitude en longitude van de aardbeving. De target variabele is dus de magnitude. Ik heb hierbij gekozen voor een 80%-20% split, waarbij het model zal bestaan uit 80% trainingsdata en 20% testdata. De random_state is hierbij 100. Vervolgens heb ik de output van alle train en testvariabelen uitgeprint. De 80% correleert aan de 1.056.246 trainingsdata rijen en de 20% weer aan de 211.250 rijen testdata. Bij het modelleren neem ik een aantal modellen, die ik uiteindelijk vergelijk met de baseline die ik stel. De baseline-model is de Nearest Neighbor model, wat de basis vormt voor dit onderdeel. Aan de hand van deze baseline moet ik kijken of ik andere modellen kan vinden die deze baseline kunnen verslaan. Hierbij betrek ik verschillende regressiemodellen bij, zoals de Decision Tree en Support Vector Machine. Welke zal de baseline verslaan?
X = PQ[['latitude', 'longitude']]
y = PQ['mag']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=100)
print("There are in total", len(X), "observations, of which", len(X_train), "are now in the train set, and", len(X_test), "in the test set.")
There are in total 1056246 observations, of which 844996 are now in the train set, and 211250 in the test set.
baseline)¶Hieronder maak ik gebruik van een Nearest Neighbors Regressie model welke ik stel als de baseline. Aan de hand van dit model zal ik vergelijkingen maken met andere modellen, om te kijken of deze baseline verslagen kan worden op zowel de precisie als de error dat hieruit komt. In het model hieronder is de precisie 76,4% als ik geen gebruik maak van de n_neigbors parameter. De precisie neemt toe naar 77% wanneer ik de n_neighbors parameter stel op 18. Dit is de hoogste precisie die dit model kan behalen met mijn gekozen dataset. Dit model doet het overigens nog best goed. Een Nearest Neighbors model kan goed verschillende groepen maken en differentieren tussen de dummy en werkelijke data in de dataset, waardoor het makkelijker kan toewijzen of een aardbeving hoort in de groep van wel- of in de groep van niet-aardbevingen. Laten we kijken of we met de andere twee modellen deze baseline kunnen verslaan.
from sklearn.neighbors import KNeighborsRegressor
model_KNN = KNeighborsRegressor(n_neighbors=18)
model_KNN.fit(X_train, y_train)
pred_KNN = model_KNN.predict(X_test)
score_KNN = model_KNN.score(X_test, y_test)
print("Accuracy:", score_KNN)
Accuracy: 0.7703893536408414
baseline)¶Evaluatie van de verschillende modellen is enorm belangrijk. Hiermee kun je de prestaties van de verschillende modellen vergelijken. Het model kan worden geanalyseerd op basis van twee prestaties, namelijk de maximale error en de root mean squared error. De maximale error geeft het hoogste verschil weer tussen de voorspelde waarden die met de predict functie worden voorspeld en de werkelijke waarden. Een lage maximale error wilt dus zeggen dat de predictie dichter bij de werkelijke waarde zit en dus ook preciezer voorspelt. Dan hebben we de root mean squared error. Dit is het kwadraat van het gemiddelde error van alle voorspellingen, waarover uiteindelijk de vierkantswortel wordt berekend. We beginnen weer bij de baseline, waarbij we kijken welke andere modellen deze baseline kunnen verslaan. Het model met de hoogste precisie is vaak degene die het laagste uitkomt in de berkende error-waarden. Laten we zien of dit daadwerkelijk het geval is.
Uit de evaluatie hieronder is te zien dat het Nearest Neighbors model de maximale error heeft van 6.87. Dat wilt zeggen dat de hoogste error te vinden is tussen de voorspelde en werkelijke waarden 6.87 is. Daarnaast is de rmse bij dit model 0.886. Dit geeft aan dat het gemiddelde van alle errors rond de 0.886 zit. Laten we kijken of we met de andere modellen deze baseline kunnen verslaan.
import io, math
from sklearn.metrics import max_error
from sklearn.metrics import mean_squared_error
Prediction_KNN = model_KNN.predict(X_test)
me = max_error(y_test, Prediction_KNN)
print("Max Error:", me)
mse = mean_squared_error(y_test, Prediction_KNN)
rmse = math.sqrt(mse)
print("Root Mean Squared Error:", rmse)
Max Error: 6.877777777777777 Root Mean Squared Error: 0.8862787250680744
Hieronder ben ik begonnen met het plotten van een Decision Tree, waarbij ik gebruik heb gemaakt van de DecisionTreeRegressor, omdat mijn voorspelling een regressieprobleem betreft. Binnen de parameters van dit model heb ik gebruik gemaakt van 3 hyperparameters, namelijk max_depth, min_samples_split en min_samples_leaf, welke staan gesteld op 19. 50 en 100. De max_depth geeft aan dat de Decision Tree uit maximaal 19 lagen mag bestaan. In het geplotte model hieronder zie je ook 19 rijen, waarin allerlei verschillende beslissingen worden genomen door het model. Parameter min_samples_split geeft aan dat een node uit minimaal 50 samples (rijen) moet bestaan om gesplitst te kunnen worden. Heeft een node minder dan 50 samples, dan wordt het niet gesplitst. Tenslotte geeft parameter min_samples_leaf weer wat de minimum aan samples moet zijn aan de leaves die uit de nodes komen door middel van een beslissing. Een leaf kan hierbij niet uit minder dan 100 samples bestaan. Ik heb deze parameters gevonden met het uitvoeren van een grid search met GridSearchCV, welke je hieronder kan zien. Zonder deze parameters komt dit model uit op een precisie van 66%. In beide gevallen presteerd het Nearest Neighbors model toch beter, waardoor de baseline niet is verslagen. Hoewel de precisie wat lager is, wilt dat niet zeggen dat dit per se het model zal zijn wat ik niet kies. Dit lees je onderin in de conclusie.
from sklearn.tree import DecisionTreeRegressor
depth = [i for i in range(10,20,1)]
split = [i for i in range(50,250,50)]
samples = [i for i in range(50,250,50)]
parameters_forest = {'max_depth': depth,
'min_samples_leaf': split,
'min_samples_split': samples
}
decisionreg = DecisionTreeRegressor()
grid_decision = GridSearchCV(estimator=decisionreg, param_grid = parameters_forest, cv = 2, n_jobs=-1)
grid_decision.fit(X_train, y_train)
print('Beste Score: %s' % grid_decision.best_score_)
print('Beste Hyperparameters: %s' % grid_decision.best_params_)
Beste Score: 0.73583202714183
Beste Hyperparameters: {'max_depth': 19, 'min_samples_leaf': 50, 'min_samples_split': 100}
model_PQ = DecisionTreeRegressor(max_depth = 19, min_samples_split = 50, min_samples_leaf = 100, random_state=100)
model_PQ.fit(X_train, y_train)
score_PQ = model_PQ.score(X_test, y_test)
print("Accuracy:", score_PQ)
Accuracy: 0.7413096452829799
In de chunk hieronder wordt de daadwerkelijke Decision Tree geplot in zowel tekstvorm als plaatje. Zoals je kunt zien wordt het met de 10 lagen al snel onoverzichtelijk. Ik heb geprobeerd om dit model overzichtelijk te maken door het formaat van figsize aan te passen en om de fontsize aan te passen. Beide opties zorgen ervoor dat de leaves en nodes van elkaar worden verspreid, maar hierdoor raakt het ook onleesbaar, omdat het lettertype te klein is. Wat dit model verder eigenlijk doet is het navigeren door ieder van de twee features. Het model kijkt allereerst door de 'latitude', omdat deze een hogere importance heeft dan 'longitude'. Het model neemt namelijk voor meer beslissingen uit 'latitude' dan uit 'longitude'. Om precies te zijn, neemt deze Tree voor 60% van alle beslissingen uit 'latitude' en voor 40% uit 'longitude'. Dit is ook te zien in de plot hieronder van de importance features, waarbij je duidelijk kunt zien wat de verhouding is tussen de twee features.
from sklearn.tree import plot_tree
plt.figure(figsize=(18,18))
plot_tree(model_PQ, fontsize=8, feature_names=['latitude', 'longitude'])
[Text(0.41935445838028534, 0.975, 'latitude <= -38.999\nsquared_error = 3.421\nsamples = 844996\nvalue = 2.933'), Text(0.04779645542125284, 0.925, 'latitude <= -61.0\nsquared_error = 3.78\nsamples = 75478\nvalue = 1.007'), Text(0.016392058883111623, 0.875, 'latitude <= -63.499\nsquared_error = 0.574\nsamples = 34784\nvalue = 0.119'), Text(0.012751254867535507, 0.825, 'longitude <= 172.517\nsquared_error = 0.186\nsamples = 31329\nvalue = 0.038'), Text(0.010376572804825894, 0.775, 'latitude <= -63.944\nsquared_error = 0.092\nsamples = 30591\nvalue = 0.019'), Text(0.007427915456816801, 0.725, 'longitude <= -175.535\nsquared_error = 0.064\nsamples = 29972\nvalue = 0.013'), Text(0.005582191009971414, 0.675, 'latitude <= -69.75\nsquared_error = 1.352\nsamples = 387\nvalue = 0.27'), Text(0.0052220496544893875, 0.625, 'squared_error = -0.0\nsamples = 283\nvalue = 0.0'), Text(0.005942332365453441, 0.625, 'squared_error = 4.294\nsamples = 104\nvalue = 1.004'), Text(0.009273639903662187, 0.675, 'latitude <= -67.468\nsquared_error = 0.046\nsamples = 29585\nvalue = 0.01'), Text(0.006662615076417494, 0.625, 'longitude <= 157.725\nsquared_error = 0.024\nsamples = 25696\nvalue = 0.005'), Text(0.0039615549103022936, 0.575, 'latitude <= -71.867\nsquared_error = 0.017\nsamples = 24576\nvalue = 0.004'), Text(0.0019807774551511468, 0.525, 'longitude <= -135.585\nsquared_error = 0.009\nsamples = 19768\nvalue = 0.002'), Text(0.0010804240664460802, 0.475, 'longitude <= -137.75\nsquared_error = 0.046\nsamples = 2374\nvalue = 0.01'), Text(0.0007202827109640534, 0.425, 'latitude <= -77.43\nsquared_error = 0.029\nsamples = 2251\nvalue = 0.006'), Text(0.0003601413554820267, 0.375, 'squared_error = 0.0\nsamples = 1592\nvalue = 0.0'), Text(0.0010804240664460802, 0.375, 'latitude <= -76.25\nsquared_error = 0.097\nsamples = 659\nvalue = 0.021'), Text(0.0007202827109640534, 0.325, 'squared_error = 0.533\nsamples = 118\nvalue = 0.118'), Text(0.0014405654219281068, 0.325, 'squared_error = 0.0\nsamples = 541\nvalue = 0.0'), Text(0.0014405654219281068, 0.425, 'squared_error = 0.361\nsamples = 123\nvalue = 0.077'), Text(0.0028811308438562136, 0.475, 'latitude <= -82.032\nsquared_error = 0.004\nsamples = 17394\nvalue = 0.001'), Text(0.002520989488374187, 0.425, 'latitude <= -84.461\nsquared_error = 0.008\nsamples = 7519\nvalue = 0.002'), Text(0.0021608481328921603, 0.375, 'squared_error = -0.0\nsamples = 5632\nvalue = 0.0'), Text(0.0028811308438562136, 0.375, 'latitude <= -83.701\nsquared_error = 0.033\nsamples = 1887\nvalue = 0.007'), Text(0.0021608481328921603, 0.325, 'longitude <= 41.239\nsquared_error = 0.082\nsamples = 479\nvalue = 0.019'), Text(0.0018007067774101335, 0.275, 'squared_error = 0.0\nsamples = 284\nvalue = 0.0'), Text(0.002520989488374187, 0.275, 'squared_error = 0.201\nsamples = 195\nvalue = 0.046'), Text(0.003601413554820267, 0.325, 'longitude <= -43.747\nsquared_error = 0.016\nsamples = 1408\nvalue = 0.003'), Text(0.0032412721993382403, 0.275, 'longitude <= -63.25\nsquared_error = 0.05\nsamples = 442\nvalue = 0.011'), Text(0.0028811308438562136, 0.225, 'squared_error = 0.0\nsamples = 342\nvalue = 0.0'), Text(0.003601413554820267, 0.225, 'squared_error = 0.219\nsamples = 100\nvalue = 0.047'), Text(0.0039615549103022936, 0.275, 'squared_error = 0.0\nsamples = 966\nvalue = 0.0'), Text(0.0032412721993382403, 0.425, 'squared_error = 0.0\nsamples = 9875\nvalue = 0.0'), Text(0.005942332365453441, 0.525, 'longitude <= -86.638\nsquared_error = 0.052\nsamples = 4808\nvalue = 0.011'), Text(0.004681837621266347, 0.475, 'longitude <= -126.487\nsquared_error = 0.13\nsamples = 1260\nvalue = 0.027'), Text(0.004321696265784321, 0.425, 'squared_error = -0.0\nsamples = 687\nvalue = 0.0'), Text(0.005041978976748374, 0.425, 'latitude <= -68.519\nsquared_error = 0.285\nsamples = 573\nvalue = 0.059'), Text(0.004681837621266347, 0.375, 'longitude <= -110.166\nsquared_error = 0.422\nsamples = 385\nvalue = 0.088'), Text(0.004321696265784321, 0.325, 'squared_error = 0.781\nsamples = 158\nvalue = 0.159'), Text(0.005041978976748374, 0.325, 'longitude <= -97.25\nsquared_error = 0.165\nsamples = 227\nvalue = 0.038'), Text(0.004681837621266347, 0.275, 'squared_error = -0.0\nsamples = 127\nvalue = 0.0'), Text(0.0054021203322304, 0.275, 'squared_error = 0.371\nsamples = 100\nvalue = 0.087'), Text(0.0054021203322304, 0.375, 'squared_error = 0.0\nsamples = 188\nvalue = 0.0'), Text(0.007202827109640534, 0.475, 'longitude <= 112.675\nsquared_error = 0.024\nsamples = 3548\nvalue = 0.005'), Text(0.0064825443986764805, 0.425, 'longitude <= 64.14\nsquared_error = 0.006\nsamples = 2906\nvalue = 0.001'), Text(0.0061224030431944534, 0.375, 'squared_error = 0.0\nsamples = 2206\nvalue = 0.0'), Text(0.006842685754158508, 0.375, 'longitude <= 71.25\nsquared_error = 0.024\nsamples = 700\nvalue = 0.006'), Text(0.0064825443986764805, 0.325, 'squared_error = 0.157\nsamples = 106\nvalue = 0.039'), Text(0.007202827109640534, 0.325, 'squared_error = 0.0\nsamples = 594\nvalue = 0.0'), Text(0.007923109820604587, 0.425, 'latitude <= -68.3\nsquared_error = 0.105\nsamples = 642\nvalue = 0.022'), Text(0.007562968465122561, 0.375, 'squared_error = 0.0\nsamples = 502\nvalue = 0.0'), Text(0.008283251176086614, 0.375, 'squared_error = 0.474\nsamples = 140\nvalue = 0.101'), Text(0.009363675242532694, 0.575, 'latitude <= -71.861\nsquared_error = 0.169\nsamples = 1120\nvalue = 0.036'), Text(0.008643392531568641, 0.525, 'longitude <= 159.75\nsquared_error = 0.076\nsamples = 900\nvalue = 0.018'), Text(0.008283251176086614, 0.475, 'squared_error = 0.289\nsamples = 123\nvalue = 0.069'), Text(0.009003533887050667, 0.475, 'latitude <= -76.407\nsquared_error = 0.041\nsamples = 777\nvalue = 0.01'), Text(0.008643392531568641, 0.425, 'squared_error = 0.0\nsamples = 586\nvalue = 0.0'), Text(0.009363675242532694, 0.425, 'squared_error = 0.167\nsamples = 191\nvalue = 0.04'), Text(0.010083957953496748, 0.525, 'longitude <= 166.25\nsquared_error = 0.542\nsamples = 220\nvalue = 0.111'), Text(0.00972381659801472, 0.475, 'squared_error = 0.496\nsamples = 119\nvalue = 0.092'), Text(0.010444099308978775, 0.475, 'squared_error = 0.596\nsamples = 101\nvalue = 0.135'), Text(0.011884664730906882, 0.625, 'longitude <= -167.75\nsquared_error = 0.194\nsamples = 3889\nvalue = 0.042'), Text(0.011524523375424854, 0.575, 'squared_error = 1.842\nsamples = 102\nvalue = 0.421'), Text(0.012244806086388907, 0.575, 'longitude <= 111.099\nsquared_error = 0.145\nsamples = 3787\nvalue = 0.031'), Text(0.011524523375424854, 0.525, 'longitude <= -82.792\nsquared_error = 0.042\nsamples = 3098\nvalue = 0.008'), Text(0.011164382019942827, 0.475, 'squared_error = 0.0\nsamples = 942\nvalue = 0.0'), Text(0.011884664730906882, 0.475, 'longitude <= -69.178\nsquared_error = 0.061\nsamples = 2156\nvalue = 0.012'), Text(0.011524523375424854, 0.425, 'squared_error = 0.585\nsamples = 145\nvalue = 0.11'), Text(0.012244806086388907, 0.425, 'longitude <= 44.191\nsquared_error = 0.022\nsamples = 2011\nvalue = 0.005'), Text(0.011884664730906882, 0.375, 'squared_error = 0.0\nsamples = 1280\nvalue = 0.0'), Text(0.012604947441870934, 0.375, 'longitude <= 53.75\nsquared_error = 0.062\nsamples = 731\nvalue = 0.013'), Text(0.012244806086388907, 0.325, 'squared_error = 0.209\nsamples = 100\nvalue = 0.046'), Text(0.012965088797352961, 0.325, 'latitude <= -65.342\nsquared_error = 0.038\nsamples = 631\nvalue = 0.008'), Text(0.012604947441870934, 0.275, 'squared_error = 0.0\nsamples = 359\nvalue = 0.0'), Text(0.013325230152834988, 0.275, 'latitude <= -64.75\nsquared_error = 0.088\nsamples = 272\nvalue = 0.018'), Text(0.012965088797352961, 0.225, 'squared_error = 0.235\nsamples = 101\nvalue = 0.049'), Text(0.013685371508317015, 0.225, 'squared_error = 0.0\nsamples = 171\nvalue = 0.0'), Text(0.012965088797352961, 0.525, 'longitude <= 119.75\nsquared_error = 0.594\nsamples = 689\nvalue = 0.135'), Text(0.012604947441870934, 0.475, 'squared_error = 2.166\nsamples = 104\nvalue = 0.574'), Text(0.013325230152834988, 0.475, 'latitude <= -66.456\nsquared_error = 0.274\nsamples = 585\nvalue = 0.057'), Text(0.012965088797352961, 0.425, 'squared_error = 0.0\nsamples = 160\nvalue = 0.0'), Text(0.013685371508317015, 0.425, 'longitude <= 134.284\nsquared_error = 0.375\nsamples = 425\nvalue = 0.079'), Text(0.013325230152834988, 0.375, 'squared_error = 0.708\nsamples = 122\nvalue = 0.155'), Text(0.01404551286379904, 0.375, 'longitude <= 154.128\nsquared_error = 0.238\nsamples = 303\nvalue = 0.049'), Text(0.013685371508317015, 0.325, 'squared_error = -0.0\nsamples = 157\nvalue = 0.0'), Text(0.014405654219281068, 0.325, 'squared_error = 0.489\nsamples = 146\nvalue = 0.101'), Text(0.013325230152834988, 0.725, 'longitude <= 128.25\nsquared_error = 1.385\nsamples = 619\nvalue = 0.295'), Text(0.012965088797352961, 0.675, 'longitude <= -126.75\nsquared_error = 0.55\nsamples = 519\nvalue = 0.108'), Text(0.012604947441870934, 0.625, 'squared_error = 2.411\nsamples = 100\nvalue = 0.514'), Text(0.013325230152834988, 0.625, 'longitude <= -61.456\nsquared_error = 0.057\nsamples = 419\nvalue = 0.012'), Text(0.012965088797352961, 0.575, 'squared_error = 0.231\nsamples = 103\nvalue = 0.048'), Text(0.013685371508317015, 0.575, 'squared_error = 0.0\nsamples = 316\nvalue = 0.0'), Text(0.013685371508317015, 0.675, 'squared_error = 4.606\nsamples = 100\nvalue = 1.261'), Text(0.015125936930245122, 0.775, 'latitude <= -65.487\nsquared_error = 3.396\nsamples = 738\nvalue = 0.844'), Text(0.014765795574763095, 0.725, 'latitude <= -72.474\nsquared_error = 0.212\nsamples = 563\nvalue = 0.039'), Text(0.014405654219281068, 0.675, 'squared_error = -0.0\nsamples = 409\nvalue = 0.0'), Text(0.015125936930245122, 0.675, 'squared_error = 0.762\nsamples = 154\nvalue = 0.142'), Text(0.015486078285727147, 0.725, 'squared_error = 4.845\nsamples = 175\nvalue = 3.434'), Text(0.020032862898687734, 0.825, 'longitude <= 144.157\nsquared_error = 3.499\nsamples = 3455\nvalue = 0.855'), Text(0.01737682040200779, 0.775, 'longitude <= -155.178\nsquared_error = 1.82\nsamples = 2812\nvalue = 0.409'), Text(0.0162063609966912, 0.725, 'latitude <= -62.006\nsquared_error = 5.253\nsamples = 306\nvalue = 1.617'), Text(0.015846219641209174, 0.675, 'squared_error = 5.89\nsamples = 181\nvalue = 2.63'), Text(0.01656650235217323, 0.675, 'squared_error = 0.696\nsamples = 125\nvalue = 0.151'), Text(0.018547279807324374, 0.725, 'longitude <= -21.531\nsquared_error = 1.201\nsamples = 2506\nvalue = 0.262'), Text(0.017286785063137283, 0.675, 'longitude <= -62.889\nsquared_error = 2.314\nsamples = 1198\nvalue = 0.536'), Text(0.01656650235217323, 0.625, 'longitude <= -75.75\nsquared_error = 0.158\nsamples = 748\nvalue = 0.029'), Text(0.0162063609966912, 0.575, 'longitude <= -143.25\nsquared_error = 0.043\nsamples = 646\nvalue = 0.008'), Text(0.015846219641209174, 0.525, 'squared_error = 0.27\nsamples = 103\nvalue = 0.051'), Text(0.01656650235217323, 0.525, 'squared_error = 0.0\nsamples = 543\nvalue = 0.0'), Text(0.016926643707655255, 0.575, 'squared_error = 0.867\nsamples = 102\nvalue = 0.162'), Text(0.018007067774101333, 0.625, 'longitude <= -53.535\nsquared_error = 4.759\nsamples = 450\nvalue = 1.379'), Text(0.01764692641861931, 0.575, 'squared_error = 5.837\nsamples = 153\nvalue = 2.633'), Text(0.01836720912958336, 0.575, 'latitude <= -61.93\nsquared_error = 2.977\nsamples = 297\nvalue = 0.734'), Text(0.018007067774101333, 0.525, 'squared_error = 0.334\nsamples = 145\nvalue = 0.068'), Text(0.018727350485065387, 0.525, 'squared_error = 4.672\nsamples = 152\nvalue = 1.368'), Text(0.01980777455151147, 0.675, 'latitude <= -62.309\nsquared_error = 0.049\nsamples = 1308\nvalue = 0.011'), Text(0.01944763319602944, 0.625, 'squared_error = 0.0\nsamples = 533\nvalue = 0.0'), Text(0.020167915906993496, 0.625, 'latitude <= -61.678\nsquared_error = 0.082\nsamples = 775\nvalue = 0.018'), Text(0.01980777455151147, 0.575, 'longitude <= 45.972\nsquared_error = 0.239\nsamples = 265\nvalue = 0.052'), Text(0.01944763319602944, 0.525, 'squared_error = 0.0\nsamples = 105\nvalue = 0.0'), Text(0.020167915906993496, 0.525, 'squared_error = 0.393\nsamples = 160\nvalue = 0.086'), Text(0.020528057262475523, 0.575, 'squared_error = 0.0\nsamples = 510\nvalue = 0.0'), Text(0.022688905395367682, 0.775, 'latitude <= -61.505\nsquared_error = 6.171\nsamples = 643\nvalue = 2.805'), Text(0.022328764039885655, 0.725, 'longitude <= 169.406\nsquared_error = 5.786\nsamples = 486\nvalue = 3.165'), Text(0.021968622684403628, 0.675, 'latitude <= -62.5\nsquared_error = 5.501\nsamples = 386\nvalue = 3.401'), Text(0.0216084813289216, 0.625, 'latitude <= -62.869\nsquared_error = 5.83\nsamples = 212\nvalue = 3.024'), Text(0.021248339973439574, 0.575, 'squared_error = 5.731\nsamples = 100\nvalue = 2.795'), Text(0.021968622684403628, 0.575, 'squared_error = 5.83\nsamples = 112\nvalue = 3.228'), Text(0.022328764039885655, 0.625, 'squared_error = 4.715\nsamples = 174\nvalue = 3.861'), Text(0.022688905395367682, 0.675, 'squared_error = 5.835\nsamples = 100\nvalue = 2.252'), Text(0.02304904675084971, 0.725, 'squared_error = 5.718\nsamples = 157\nvalue = 1.69'), Text(0.07920085195939407, 0.875, 'longitude <= 164.002\nsquared_error = 5.27\nsamples = 40694\nvalue = 1.766'), Text(0.05248075494631643, 0.825, 'latitude <= -54.002\nsquared_error = 5.168\nsamples = 35491\nvalue = 1.541'), Text(0.0410223512728746, 0.775, 'longitude <= -17.605\nsquared_error = 6.013\nsamples = 13850\nvalue = 2.349'), Text(0.033493146059828484, 0.725, 'longitude <= -32.45\nsquared_error = 5.524\nsamples = 9271\nvalue = 3.093'), Text(0.02635784545434083, 0.675, 'latitude <= -60.005\nsquared_error = 5.406\nsamples = 4434\nvalue = 1.574'), Text(0.02304904675084971, 0.625, 'longitude <= -58.835\nsquared_error = 5.284\nsamples = 667\nvalue = 3.109'), Text(0.022688905395367682, 0.575, 'squared_error = 0.521\nsamples = 195\nvalue = 0.104'), Text(0.023409188106331736, 0.575, 'latitude <= -60.5\nsquared_error = 1.98\nsamples = 472\nvalue = 4.351'), Text(0.02304904675084971, 0.525, 'squared_error = 3.967\nsamples = 195\nvalue = 3.846'), Text(0.023769329461813763, 0.525, 'longitude <= -46.3\nsquared_error = 0.275\nsamples = 277\nvalue = 4.706'), Text(0.023409188106331736, 0.475, 'squared_error = 0.343\nsamples = 122\nvalue = 4.758'), Text(0.02412947081729579, 0.475, 'squared_error = 0.217\nsamples = 155\nvalue = 4.666'), Text(0.029666644157831948, 0.625, 'longitude <= -118.514\nsquared_error = 4.936\nsamples = 3767\nvalue = 1.302'), Text(0.026920566322281497, 0.575, 'longitude <= -151.879\nsquared_error = 6.302\nsamples = 2008\nvalue = 2.085'), Text(0.025209894883741868, 0.525, 'longitude <= -169.943\nsquared_error = 0.575\nsamples = 545\nvalue = 0.118'), Text(0.02484975352825984, 0.475, 'squared_error = 0.0\nsamples = 206\nvalue = 0.0'), Text(0.025570036239223895, 0.475, 'longitude <= -159.154\nsquared_error = 0.911\nsamples = 339\nvalue = 0.189'), Text(0.025209894883741868, 0.425, 'longitude <= -164.25\nsquared_error = 1.257\nsamples = 205\nvalue = 0.265'), Text(0.02484975352825984, 0.375, 'squared_error = 0.973\nsamples = 100\nvalue = 0.226'), Text(0.025570036239223895, 0.375, 'squared_error = 1.524\nsamples = 105\nvalue = 0.302'), Text(0.025930177594705922, 0.425, 'squared_error = 0.36\nsamples = 134\nvalue = 0.074'), Text(0.028631237760821122, 0.525, 'latitude <= -56.998\nsquared_error = 6.458\nsamples = 1463\nvalue = 2.817'), Text(0.02737074301663403, 0.475, 'longitude <= -139.116\nsquared_error = 4.671\nsamples = 505\nvalue = 1.205'), Text(0.026650460305669976, 0.425, 'latitude <= -58.468\nsquared_error = 6.385\nsamples = 268\nvalue = 2.253'), Text(0.02629031895018795, 0.375, 'squared_error = 5.151\nsamples = 118\nvalue = 1.374'), Text(0.027010601661152003, 0.375, 'squared_error = 6.268\nsamples = 150\nvalue = 2.945'), Text(0.02809102572759808, 0.425, 'latitude <= -58.25\nsquared_error = 0.085\nsamples = 237\nvalue = 0.019'), Text(0.027730884372116054, 0.375, 'squared_error = 0.0\nsamples = 137\nvalue = 0.0'), Text(0.028451167083080108, 0.375, 'squared_error = 0.2\nsamples = 100\nvalue = 0.045'), Text(0.029891732505008217, 0.475, 'latitude <= -54.499\nsquared_error = 5.306\nsamples = 958\nvalue = 3.667'), Text(0.02953159114952619, 0.425, 'latitude <= -56.502\nsquared_error = 5.727\nsamples = 841\nvalue = 3.481'), Text(0.029171449794044162, 0.375, 'squared_error = 0.293\nsamples = 109\nvalue = 5.061'), Text(0.029891732505008217, 0.375, 'longitude <= -130.973\nsquared_error = 6.109\nsamples = 732\nvalue = 3.246'), Text(0.029171449794044162, 0.325, 'latitude <= -56.006\nsquared_error = 6.524\nsamples = 317\nvalue = 2.391'), Text(0.028811308438562135, 0.275, 'squared_error = 5.693\nsamples = 108\nvalue = 3.383'), Text(0.02953159114952619, 0.275, 'longitude <= -139.75\nsquared_error = 6.182\nsamples = 209\nvalue = 1.878'), Text(0.029171449794044162, 0.225, 'squared_error = 4.787\nsamples = 109\nvalue = 1.372'), Text(0.029891732505008217, 0.225, 'squared_error = 7.121\nsamples = 100\nvalue = 2.429'), Text(0.03061201521597227, 0.325, 'latitude <= -55.808\nsquared_error = 4.808\nsamples = 415\nvalue = 3.899'), Text(0.030251873860490244, 0.275, 'squared_error = 6.907\nsamples = 100\nvalue = 3.073'), Text(0.030972156571454294, 0.275, 'latitude <= -55.002\nsquared_error = 3.857\nsamples = 315\nvalue = 4.161'), Text(0.03061201521597227, 0.225, 'squared_error = 2.584\nsamples = 190\nvalue = 4.595'), Text(0.03133229792693632, 0.225, 'squared_error = 5.069\nsamples = 125\nvalue = 3.501'), Text(0.030251873860490244, 0.425, 'squared_error = 0.237\nsamples = 117\nvalue = 5.007'), Text(0.0324127219933824, 0.575, 'longitude <= -70.906\nsquared_error = 1.881\nsamples = 1759\nvalue = 0.409'), Text(0.030972156571454294, 0.525, 'latitude <= -56.494\nsquared_error = 0.096\nsamples = 901\nvalue = 0.021'), Text(0.03061201521597227, 0.475, 'squared_error = -0.0\nsamples = 594\nvalue = 0.0'), Text(0.03133229792693632, 0.475, 'latitude <= -55.076\nsquared_error = 0.278\nsamples = 307\nvalue = 0.061'), Text(0.030972156571454294, 0.425, 'squared_error = 0.537\nsamples = 157\nvalue = 0.118'), Text(0.03169243928241835, 0.425, 'squared_error = 0.0\nsamples = 150\nvalue = 0.0'), Text(0.03385328741531051, 0.525, 'longitude <= -53.559\nsquared_error = 3.43\nsamples = 858\nvalue = 0.818'), Text(0.03277286334886443, 0.475, 'latitude <= -57.955\nsquared_error = 4.961\nsamples = 429\nvalue = 1.334'), Text(0.0324127219933824, 0.425, 'squared_error = 3.468\nsamples = 165\nvalue = 0.855'), Text(0.03313300470434646, 0.425, 'longitude <= -65.049\nsquared_error = 5.661\nsamples = 264\nvalue = 1.634'), Text(0.03277286334886443, 0.375, 'squared_error = 6.774\nsamples = 103\nvalue = 2.309'), Text(0.033493146059828484, 0.375, 'squared_error = 4.471\nsamples = 161\nvalue = 1.202'), Text(0.03493371148175659, 0.475, 'latitude <= -55.859\nsquared_error = 1.365\nsamples = 429\nvalue = 0.301'), Text(0.034573570126274565, 0.425, 'longitude <= -41.897\nsquared_error = 0.392\nsamples = 313\nvalue = 0.079'), Text(0.03421342877079254, 0.375, 'squared_error = -0.0\nsamples = 170\nvalue = 0.0'), Text(0.03493371148175659, 0.375, 'squared_error = 0.843\nsamples = 143\nvalue = 0.172'), Text(0.03529385283723862, 0.425, 'squared_error = 3.498\nsamples = 116\nvalue = 0.901'), Text(0.040628446665316134, 0.675, 'longitude <= -23.008\nsquared_error = 1.579\nsamples = 4837\nvalue = 4.486'), Text(0.03885024872262363, 0.625, 'longitude <= -28.498\nsquared_error = 1.104\nsamples = 4602\nvalue = 4.591'), Text(0.036374276903684694, 0.575, 'latitude <= -56.0\nsquared_error = 2.577\nsamples = 652\nvalue = 4.111'), Text(0.036014135548202666, 0.525, 'squared_error = 5.422\nsamples = 169\nvalue = 3.019'), Text(0.03673441825916672, 0.525, 'latitude <= -55.05\nsquared_error = 1.019\nsamples = 483\nvalue = 4.493'), Text(0.036374276903684694, 0.475, 'latitude <= -55.43\nsquared_error = 0.617\nsamples = 383\nvalue = 4.6'), Text(0.036014135548202666, 0.425, 'squared_error = 1.593\nsamples = 107\nvalue = 4.405'), Text(0.03673441825916672, 0.425, 'latitude <= -55.214\nsquared_error = 0.218\nsamples = 276\nvalue = 4.676'), Text(0.036374276903684694, 0.375, 'squared_error = 0.29\nsamples = 163\nvalue = 4.735'), Text(0.03709455961464875, 0.375, 'squared_error = 0.103\nsamples = 113\nvalue = 4.59'), Text(0.03709455961464875, 0.475, 'squared_error = 2.344\nsamples = 100\nvalue = 4.082'), Text(0.04132622054156256, 0.575, 'latitude <= -55.243\nsquared_error = 0.816\nsamples = 3950\nvalue = 4.67'), Text(0.040966079186080535, 0.525, 'longitude <= -24.502\nsquared_error = 0.73\nsamples = 3849\nvalue = 4.695'), Text(0.04060593783059851, 0.475, 'latitude <= -56.875\nsquared_error = 0.628\nsamples = 3664\nvalue = 4.712'), Text(0.03817498368109483, 0.425, 'longitude <= -26.985\nsquared_error = 0.84\nsamples = 1713\nvalue = 4.654'), Text(0.0378148423256128, 0.375, 'squared_error = 2.549\nsamples = 172\nvalue = 4.195'), Text(0.038535125036576856, 0.375, 'latitude <= -59.529\nsquared_error = 0.623\nsamples = 1541\nvalue = 4.705'), Text(0.03763477164787179, 0.325, 'longitude <= -26.008\nsquared_error = 0.597\nsamples = 429\nvalue = 4.852'), Text(0.03727463029238976, 0.275, 'latitude <= -60.091\nsquared_error = 0.271\nsamples = 283\nvalue = 4.93'), Text(0.036914488936907734, 0.225, 'squared_error = 0.177\nsamples = 117\nvalue = 4.847'), Text(0.03763477164787179, 0.225, 'squared_error = 0.329\nsamples = 166\nvalue = 4.988'), Text(0.037994913003353815, 0.275, 'squared_error = 1.195\nsamples = 146\nvalue = 4.701'), Text(0.039435478425281924, 0.325, 'longitude <= -26.0\nsquared_error = 0.622\nsamples = 1112\nvalue = 4.648'), Text(0.03871519571431787, 0.275, 'latitude <= -58.503\nsquared_error = 1.282\nsamples = 208\nvalue = 4.491'), Text(0.03835505435883584, 0.225, 'squared_error = 1.235\nsamples = 100\nvalue = 4.615'), Text(0.0390753370697999, 0.225, 'squared_error = 1.298\nsamples = 108\nvalue = 4.376'), Text(0.04015576113624598, 0.275, 'latitude <= -58.994\nsquared_error = 0.463\nsamples = 904\nvalue = 4.684'), Text(0.03979561978076395, 0.225, 'squared_error = 0.7\nsamples = 149\nvalue = 4.541'), Text(0.040515902491728005, 0.225, 'latitude <= -58.576\nsquared_error = 0.411\nsamples = 755\nvalue = 4.713'), Text(0.03979561978076395, 0.175, 'latitude <= -58.765\nsquared_error = 0.198\nsamples = 220\nvalue = 4.815'), Text(0.039435478425281924, 0.125, 'squared_error = 0.153\nsamples = 109\nvalue = 4.764'), Text(0.04015576113624598, 0.125, 'squared_error = 0.238\nsamples = 111\nvalue = 4.864'), Text(0.04123618520269206, 0.175, 'longitude <= -25.119\nsquared_error = 0.493\nsamples = 535\nvalue = 4.671'), Text(0.04087604384721003, 0.125, 'longitude <= -25.474\nsquared_error = 0.37\nsamples = 379\nvalue = 4.708'), Text(0.040515902491728005, 0.075, 'squared_error = 0.43\nsamples = 183\nvalue = 4.629'), Text(0.04123618520269206, 0.075, 'squared_error = 0.301\nsamples = 196\nvalue = 4.782'), Text(0.041596326558174086, 0.125, 'squared_error = 0.78\nsamples = 156\nvalue = 4.579'), Text(0.04303689198010219, 0.425, 'latitude <= -55.5\nsquared_error = 0.437\nsamples = 1951\nvalue = 4.763'), Text(0.04213653859139712, 0.375, 'latitude <= -56.503\nsquared_error = 0.399\nsamples = 1652\nvalue = 4.804'), Text(0.04141625588043307, 0.325, 'longitude <= -25.573\nsquared_error = 0.333\nsamples = 227\nvalue = 4.985'), Text(0.041056114524951046, 0.275, 'squared_error = 0.368\nsamples = 124\nvalue = 4.931'), Text(0.0417763972359151, 0.275, 'squared_error = 0.283\nsamples = 103\nvalue = 5.05'), Text(0.042856821302361174, 0.325, 'latitude <= -56.412\nsquared_error = 0.403\nsamples = 1425\nvalue = 4.776'), Text(0.04249667994687915, 0.275, 'squared_error = 1.568\nsamples = 101\nvalue = 4.517'), Text(0.0432169626578432, 0.275, 'latitude <= -56.24\nsquared_error = 0.309\nsamples = 1324\nvalue = 4.795'), Text(0.042316609269138133, 0.225, 'longitude <= -26.758\nsquared_error = 0.301\nsamples = 230\nvalue = 4.902'), Text(0.04195646791365611, 0.175, 'squared_error = 0.405\nsamples = 108\nvalue = 4.965'), Text(0.04267675062462016, 0.175, 'squared_error = 0.202\nsamples = 122\nvalue = 4.846'), Text(0.04411731604654827, 0.225, 'longitude <= -27.008\nsquared_error = 0.308\nsamples = 1094\nvalue = 4.773'), Text(0.043397033335584215, 0.175, 'latitude <= -55.746\nsquared_error = 0.313\nsamples = 734\nvalue = 4.814'), Text(0.04303689198010219, 0.125, 'latitude <= -56.003\nsquared_error = 0.323\nsamples = 584\nvalue = 4.786'), Text(0.042316609269138133, 0.075, 'latitude <= -56.117\nsquared_error = 0.255\nsamples = 300\nvalue = 4.843'), Text(0.04195646791365611, 0.025, 'squared_error = 0.231\nsamples = 119\nvalue = 4.774'), Text(0.04267675062462016, 0.025, 'squared_error = 0.267\nsamples = 181\nvalue = 4.888'), Text(0.04375717469106624, 0.075, 'longitude <= -27.495\nsquared_error = 0.387\nsamples = 284\nvalue = 4.726'), Text(0.043397033335584215, 0.025, 'squared_error = 0.463\nsamples = 183\nvalue = 4.683'), Text(0.04411731604654827, 0.025, 'squared_error = 0.238\nsamples = 101\nvalue = 4.804'), Text(0.04375717469106624, 0.125, 'squared_error = 0.262\nsamples = 150\nvalue = 4.923'), Text(0.04483759875751232, 0.175, 'latitude <= -56.07\nsquared_error = 0.285\nsamples = 360\nvalue = 4.689'), Text(0.044477457402030296, 0.125, 'squared_error = 0.174\nsamples = 105\nvalue = 4.764'), Text(0.04519774011299435, 0.125, 'longitude <= -26.501\nsquared_error = 0.328\nsamples = 255\nvalue = 4.658'), Text(0.04483759875751232, 0.075, 'squared_error = 0.165\nsamples = 139\nvalue = 4.731'), Text(0.04555788146847638, 0.075, 'squared_error = 0.509\nsamples = 116\nvalue = 4.572'), Text(0.043937245368807255, 0.375, 'longitude <= -27.749\nsquared_error = 0.584\nsamples = 299\nvalue = 4.533'), Text(0.04357710401332523, 0.325, 'squared_error = 0.292\nsamples = 195\nvalue = 4.64'), Text(0.04429738672428928, 0.325, 'squared_error = 1.069\nsamples = 104\nvalue = 4.334'), Text(0.04132622054156256, 0.475, 'squared_error = 2.63\nsamples = 185\nvalue = 4.352'), Text(0.04168636189704459, 0.525, 'squared_error = 3.207\nsamples = 101\nvalue = 3.75'), Text(0.042406644608008644, 0.625, 'latitude <= -59.024\nsquared_error = 6.402\nsamples = 235\nvalue = 2.421'), Text(0.04204650325252662, 0.575, 'squared_error = 4.822\nsamples = 126\nvalue = 3.81'), Text(0.04276678596349067, 0.575, 'squared_error = 3.418\nsamples = 109\nvalue = 0.815'), Text(0.04855155648592072, 0.725, 'longitude <= 143.547\nsquared_error = 3.614\nsamples = 4579\nvalue = 0.843'), Text(0.046053075832264166, 0.675, 'latitude <= -54.493\nsquared_error = 1.692\nsamples = 3640\nvalue = 0.354'), Text(0.04569293447678214, 0.625, 'longitude <= 1.815\nsquared_error = 1.094\nsamples = 3537\nvalue = 0.219'), Text(0.043487068674454725, 0.575, 'latitude <= -58.497\nsquared_error = 5.058\nsamples = 556\nvalue = 1.268'), Text(0.0431269273189727, 0.525, 'squared_error = 2.16\nsamples = 173\nvalue = 0.433'), Text(0.04384721002993675, 0.525, 'latitude <= -57.047\nsquared_error = 5.91\nsamples = 383\nvalue = 1.645'), Text(0.043487068674454725, 0.475, 'squared_error = 7.185\nsamples = 119\nvalue = 2.487'), Text(0.04420735138541878, 0.475, 'longitude <= -5.0\nsquared_error = 4.87\nsamples = 264\nvalue = 1.265'), Text(0.04384721002993675, 0.425, 'squared_error = 0.609\nsamples = 133\nvalue = 0.118'), Text(0.044567492740900806, 0.425, 'squared_error = 6.506\nsamples = 131\nvalue = 2.429'), Text(0.04789880027910955, 0.575, 'latitude <= -54.977\nsquared_error = 0.111\nsamples = 2981\nvalue = 0.024'), Text(0.046908411551533975, 0.525, 'latitude <= -55.435\nsquared_error = 0.047\nsamples = 2746\nvalue = 0.01'), Text(0.04600805816282891, 0.475, 'latitude <= -60.125\nsquared_error = 0.02\nsamples = 2519\nvalue = 0.004'), Text(0.04528777545186486, 0.425, 'longitude <= 82.084\nsquared_error = 0.089\nsamples = 237\nvalue = 0.019'), Text(0.04492763409638283, 0.375, 'squared_error = 0.0\nsamples = 127\nvalue = 0.0'), Text(0.04564791680734688, 0.375, 'squared_error = 0.191\nsamples = 110\nvalue = 0.042'), Text(0.04672834087379296, 0.425, 'longitude <= 83.536\nsquared_error = 0.013\nsamples = 2282\nvalue = 0.002'), Text(0.046368199518310935, 0.375, 'squared_error = 0.0\nsamples = 1321\nvalue = 0.0'), Text(0.04708848222927499, 0.375, 'longitude <= 90.25\nsquared_error = 0.03\nsamples = 961\nvalue = 0.006'), Text(0.04672834087379296, 0.325, 'squared_error = 0.28\nsamples = 103\nvalue = 0.052'), Text(0.047448623584757016, 0.325, 'squared_error = 0.0\nsamples = 858\nvalue = 0.0'), Text(0.04780876494023904, 0.475, 'longitude <= 76.387\nsquared_error = 0.344\nsamples = 227\nvalue = 0.078'), Text(0.047448623584757016, 0.425, 'squared_error = 0.139\nsamples = 120\nvalue = 0.034'), Text(0.04816890629572107, 0.425, 'squared_error = 0.569\nsamples = 107\nvalue = 0.128'), Text(0.048889189006685124, 0.525, 'longitude <= 61.25\nsquared_error = 0.833\nsamples = 235\nvalue = 0.182'), Text(0.0485290476512031, 0.475, 'squared_error = 1.108\nsamples = 100\nvalue = 0.241'), Text(0.04924933036216715, 0.475, 'squared_error = 0.624\nsamples = 135\nvalue = 0.138'), Text(0.04641321718774619, 0.625, 'squared_error = 0.289\nsamples = 103\nvalue = 4.971'), Text(0.05105003713957729, 0.675, 'longitude <= 149.994\nsquared_error = 6.531\nsamples = 939\nvalue = 2.742'), Text(0.05032975442861323, 0.625, 'longitude <= 146.044\nsquared_error = 5.466\nsamples = 431\nvalue = 3.558'), Text(0.049969613073131205, 0.575, 'squared_error = 6.393\nsamples = 100\nvalue = 2.34'), Text(0.05068989578409526, 0.575, 'longitude <= 147.985\nsquared_error = 4.602\nsamples = 331\nvalue = 3.926'), Text(0.05032975442861323, 0.525, 'latitude <= -56.397\nsquared_error = 3.717\nsamples = 202\nvalue = 4.226'), Text(0.049969613073131205, 0.475, 'squared_error = 4.207\nsamples = 100\nvalue = 3.971'), Text(0.05068989578409526, 0.475, 'squared_error = 3.11\nsamples = 102\nvalue = 4.476'), Text(0.05105003713957729, 0.525, 'squared_error = 5.626\nsamples = 129\nvalue = 3.457'), Text(0.05177031985054134, 0.625, 'latitude <= -59.507\nsquared_error = 6.39\nsamples = 508\nvalue = 2.05'), Text(0.051410178495059314, 0.575, 'squared_error = 7.079\nsamples = 123\nvalue = 3.246'), Text(0.05213046120602336, 0.575, 'longitude <= 157.075\nsquared_error = 5.567\nsamples = 385\nvalue = 1.668'), Text(0.05177031985054134, 0.525, 'squared_error = 0.57\nsamples = 143\nvalue = 0.127'), Text(0.05249060256150539, 0.525, 'longitude <= 159.301\nsquared_error = 6.289\nsamples = 242\nvalue = 2.578'), Text(0.05213046120602336, 0.475, 'squared_error = 4.668\nsamples = 142\nvalue = 3.827'), Text(0.052850743916987415, 0.475, 'squared_error = 3.23\nsamples = 100\nvalue = 0.804'), Text(0.06393915861975825, 0.775, 'longitude <= -92.499\nsquared_error = 3.942\nsamples = 21641\nvalue = 1.023'), Text(0.0566322281495487, 0.725, 'latitude <= -49.092\nsquared_error = 1.1\nsamples = 4565\nvalue = 0.226'), Text(0.05447138001665654, 0.675, 'longitude <= -118.903\nsquared_error = 2.458\nsamples = 1570\nvalue = 0.535'), Text(0.05321088527246944, 0.625, 'latitude <= -53.519\nsquared_error = 0.884\nsamples = 1015\nvalue = 0.184'), Text(0.052850743916987415, 0.575, 'squared_error = 4.691\nsamples = 139\nvalue = 1.222'), Text(0.05357102662795147, 0.575, 'latitude <= -53.021\nsquared_error = 0.082\nsamples = 876\nvalue = 0.019'), Text(0.05321088527246944, 0.525, 'squared_error = 0.486\nsamples = 101\nvalue = 0.122'), Text(0.053931167983433496, 0.525, 'longitude <= -172.25\nsquared_error = 0.027\nsamples = 775\nvalue = 0.006'), Text(0.05357102662795147, 0.475, 'squared_error = 0.209\nsamples = 100\nvalue = 0.046'), Text(0.054291309338915524, 0.475, 'squared_error = 0.0\nsamples = 675\nvalue = 0.0'), Text(0.05573187476084363, 0.625, 'longitude <= -113.513\nsquared_error = 4.7\nsamples = 555\nvalue = 1.177'), Text(0.05501159204987958, 0.575, 'latitude <= -50.492\nsquared_error = 6.434\nsamples = 209\nvalue = 3.107'), Text(0.05465145069439755, 0.525, 'squared_error = 5.832\nsamples = 107\nvalue = 1.853'), Text(0.055371733405361605, 0.525, 'squared_error = 3.686\nsamples = 102\nvalue = 4.423'), Text(0.056452157471807686, 0.575, 'longitude <= -107.25\nsquared_error = 0.044\nsamples = 346\nvalue = 0.011'), Text(0.05609201611632566, 0.525, 'squared_error = 0.142\nsamples = 106\nvalue = 0.037'), Text(0.05681229882728971, 0.525, 'squared_error = 0.0\nsamples = 240\nvalue = 0.0'), Text(0.058793076282440855, 0.675, 'longitude <= -177.25\nsquared_error = 0.311\nsamples = 2995\nvalue = 0.064'), Text(0.05843293492695883, 0.625, 'squared_error = 1.624\nsamples = 110\nvalue = 0.402'), Text(0.05915321763792288, 0.625, 'longitude <= -117.467\nsquared_error = 0.257\nsamples = 2885\nvalue = 0.052'), Text(0.057892722893735794, 0.575, 'longitude <= -174.25\nsquared_error = 0.053\nsamples = 2011\nvalue = 0.011'), Text(0.05753258153825377, 0.525, 'squared_error = 0.592\nsamples = 104\nvalue = 0.132'), Text(0.05825286424921782, 0.525, 'latitude <= -39.75\nsquared_error = 0.023\nsamples = 1907\nvalue = 0.005'), Text(0.057892722893735794, 0.475, 'latitude <= -46.511\nsquared_error = 0.015\nsamples = 1720\nvalue = 0.003'), Text(0.05753258153825377, 0.425, 'longitude <= -153.185\nsquared_error = 0.054\nsamples = 460\nvalue = 0.011'), Text(0.05717244018277174, 0.375, 'squared_error = 0.148\nsamples = 168\nvalue = 0.03'), Text(0.057892722893735794, 0.375, 'squared_error = 0.0\nsamples = 292\nvalue = 0.0'), Text(0.05825286424921782, 0.425, 'squared_error = 0.0\nsamples = 1260\nvalue = 0.0'), Text(0.05861300560469984, 0.475, 'squared_error = 0.098\nsamples = 187\nvalue = 0.023'), Text(0.06041371238210998, 0.575, 'longitude <= -104.535\nsquared_error = 0.712\nsamples = 874\nvalue = 0.144'), Text(0.05969342967114592, 0.525, 'longitude <= -107.772\nsquared_error = 1.075\nsamples = 434\nvalue = 0.221'), Text(0.059333288315663896, 0.475, 'longitude <= -113.529\nsquared_error = 0.671\nsamples = 325\nvalue = 0.138'), Text(0.05897314696018187, 0.425, 'squared_error = 1.251\nsamples = 120\nvalue = 0.256'), Text(0.05969342967114592, 0.425, 'longitude <= -110.75\nsquared_error = 0.319\nsamples = 205\nvalue = 0.069'), Text(0.059333288315663896, 0.375, 'squared_error = 0.214\nsamples = 102\nvalue = 0.046'), Text(0.06005357102662795, 0.375, 'squared_error = 0.421\nsamples = 103\nvalue = 0.091'), Text(0.06005357102662795, 0.475, 'squared_error = 2.198\nsamples = 109\nvalue = 0.467'), Text(0.06113399509307403, 0.525, 'longitude <= -95.25\nsquared_error = 0.343\nsamples = 440\nvalue = 0.069'), Text(0.060773853737592004, 0.475, 'longitude <= -99.599\nsquared_error = 0.165\nsamples = 332\nvalue = 0.032'), Text(0.06041371238210998, 0.425, 'squared_error = 0.319\nsamples = 171\nvalue = 0.061'), Text(0.06113399509307403, 0.425, 'squared_error = 0.0\nsamples = 161\nvalue = 0.0'), Text(0.06149413644855606, 0.475, 'squared_error = 0.873\nsamples = 108\nvalue = 0.182'), Text(0.07124608908996781, 0.725, 'longitude <= -71.019\nsquared_error = 4.487\nsamples = 17076\nvalue = 1.236'), Text(0.06401512593693025, 0.675, 'latitude <= -45.995\nsquared_error = 6.003\nsamples = 2069\nvalue = 2.435'), Text(0.06293470187048417, 0.625, 'longitude <= -76.425\nsquared_error = 2.701\nsamples = 638\nvalue = 0.621'), Text(0.06221441915952011, 0.575, 'latitude <= -48.466\nsquared_error = 0.456\nsamples = 437\nvalue = 0.097'), Text(0.061854277804038085, 0.525, 'squared_error = -0.0\nsamples = 295\nvalue = 0.0'), Text(0.06257456051500214, 0.525, 'squared_error = 1.343\nsamples = 142\nvalue = 0.3'), Text(0.06365498458144822, 0.575, 'latitude <= -50.12\nsquared_error = 5.687\nsamples = 201\nvalue = 1.76'), Text(0.0632948432259662, 0.525, 'squared_error = 5.97\nsamples = 100\nvalue = 1.963'), Text(0.06401512593693025, 0.525, 'squared_error = 5.325\nsamples = 101\nvalue = 1.559'), Text(0.06509555000337633, 0.625, 'latitude <= -45.507\nsquared_error = 5.354\nsamples = 1431\nvalue = 3.244'), Text(0.0647354086478943, 0.575, 'squared_error = 0.262\nsamples = 109\nvalue = 5.004'), Text(0.06545569135885836, 0.575, 'longitude <= -75.993\nsquared_error = 5.498\nsamples = 1322\nvalue = 3.099'), Text(0.0647354086478943, 0.525, 'latitude <= -40.561\nsquared_error = 5.97\nsamples = 865\nvalue = 2.772'), Text(0.06437526729241227, 0.475, 'latitude <= -41.497\nsquared_error = 5.677\nsamples = 719\nvalue = 3.101'), Text(0.06365498458144822, 0.425, 'longitude <= -85.996\nsquared_error = 6.23\nsamples = 501\nvalue = 2.608'), Text(0.0632948432259662, 0.375, 'squared_error = 3.771\nsamples = 109\nvalue = 1.002'), Text(0.06401512593693025, 0.375, 'longitude <= -80.005\nsquared_error = 5.997\nsamples = 392\nvalue = 3.054'), Text(0.06365498458144822, 0.325, 'longitude <= -82.953\nsquared_error = 5.24\nsamples = 267\nvalue = 3.421'), Text(0.0632948432259662, 0.275, 'squared_error = 5.946\nsamples = 116\nvalue = 3.037'), Text(0.06401512593693025, 0.275, 'squared_error = 4.498\nsamples = 151\nvalue = 3.715'), Text(0.06437526729241227, 0.325, 'squared_error = 6.714\nsamples = 125\nvalue = 2.272'), Text(0.06509555000337633, 0.425, 'latitude <= -41.143\nsquared_error = 2.565\nsamples = 218\nvalue = 4.233'), Text(0.0647354086478943, 0.375, 'squared_error = 0.159\nsamples = 118\nvalue = 4.861'), Text(0.06545569135885836, 0.375, 'squared_error = 4.39\nsamples = 100\nvalue = 3.493'), Text(0.06509555000337633, 0.475, 'squared_error = 4.265\nsamples = 146\nvalue = 1.154'), Text(0.06617597406982241, 0.525, 'longitude <= -74.501\nsquared_error = 4.018\nsamples = 457\nvalue = 3.718'), Text(0.06581583271434038, 0.475, 'squared_error = 3.726\nsamples = 134\nvalue = 4.314'), Text(0.06653611542530444, 0.475, 'longitude <= -72.499\nsquared_error = 3.931\nsamples = 323\nvalue = 3.471'), Text(0.06617597406982241, 0.425, 'squared_error = 4.283\nsamples = 192\nvalue = 3.26'), Text(0.06689625678078646, 0.425, 'squared_error = 3.252\nsamples = 131\nvalue = 3.781'), Text(0.07847705224300539, 0.675, 'longitude <= -18.85\nsquared_error = 4.052\nsamples = 15007\nvalue = 1.071'), Text(0.06797668084723255, 0.625, 'latitude <= -52.559\nsquared_error = 0.547\nsamples = 2661\nvalue = 0.104'), Text(0.06725639813626849, 0.575, 'longitude <= -45.733\nsquared_error = 3.366\nsamples = 295\nvalue = 0.718'), Text(0.06689625678078646, 0.525, 'squared_error = 4.826\nsamples = 159\nvalue = 1.109'), Text(0.06761653949175052, 0.525, 'squared_error = 1.271\nsamples = 136\nvalue = 0.261'), Text(0.06869696355819659, 0.575, 'longitude <= -21.25\nsquared_error = 0.143\nsamples = 2366\nvalue = 0.028'), Text(0.06833682220271456, 0.525, 'longitude <= -68.75\nsquared_error = 0.091\nsamples = 2247\nvalue = 0.018'), Text(0.06797668084723255, 0.475, 'squared_error = 0.859\nsamples = 119\nvalue = 0.171'), Text(0.06869696355819659, 0.475, 'latitude <= -51.162\nsquared_error = 0.046\nsamples = 2128\nvalue = 0.009'), Text(0.06779661016949153, 0.425, 'longitude <= -46.427\nsquared_error = 0.251\nsamples = 240\nvalue = 0.045'), Text(0.0674364688140095, 0.375, 'squared_error = 0.0\nsamples = 116\nvalue = 0.0'), Text(0.06815675152497355, 0.375, 'squared_error = 0.483\nsamples = 124\nvalue = 0.088'), Text(0.06959731694690166, 0.425, 'latitude <= -49.546\nsquared_error = 0.02\nsamples = 1888\nvalue = 0.005'), Text(0.0688770342359376, 0.375, 'longitude <= -41.75\nsquared_error = 0.095\nsamples = 232\nvalue = 0.02'), Text(0.06851689288045558, 0.325, 'squared_error = 0.0\nsamples = 131\nvalue = 0.0'), Text(0.06923717559141963, 0.325, 'squared_error = 0.217\nsamples = 101\nvalue = 0.047'), Text(0.07031759965786571, 0.375, 'latitude <= -40.368\nsquared_error = 0.01\nsamples = 1656\nvalue = 0.002'), Text(0.06995745830238369, 0.325, 'squared_error = 0.0\nsamples = 1425\nvalue = 0.0'), Text(0.07067774101334774, 0.325, 'longitude <= -48.75\nsquared_error = 0.069\nsamples = 231\nvalue = 0.017'), Text(0.07031759965786571, 0.275, 'squared_error = 0.155\nsamples = 102\nvalue = 0.039'), Text(0.07103788236882977, 0.275, 'squared_error = 0.0\nsamples = 129\nvalue = 0.0'), Text(0.06905710491367861, 0.525, 'squared_error = 1.087\nsamples = 119\nvalue = 0.218'), Text(0.08897742363877822, 0.625, 'latitude <= -48.505\nsquared_error = 4.563\nsamples = 12346\nvalue = 1.28'), Text(0.08004141625588043, 0.575, 'longitude <= 106.036\nsquared_error = 5.382\nsamples = 5112\nvalue = 1.778'), Text(0.07634996736218966, 0.525, 'longitude <= 31.49\nsquared_error = 4.432\nsamples = 2936\nvalue = 1.229'), Text(0.07409908389042699, 0.475, 'latitude <= -52.015\nsquared_error = 5.765\nsamples = 1590\nvalue = 2.13'), Text(0.07247844779075788, 0.425, 'longitude <= 8.539\nsquared_error = 5.411\nsamples = 899\nvalue = 3.06'), Text(0.07175816507979382, 0.375, 'longitude <= -4.634\nsquared_error = 4.281\nsamples = 232\nvalue = 1.121'), Text(0.0713980237243118, 0.325, 'squared_error = 2.606\nsamples = 100\nvalue = 0.595'), Text(0.07211830643527585, 0.325, 'squared_error = 5.181\nsamples = 132\nvalue = 1.52'), Text(0.07319873050172193, 0.375, 'latitude <= -53.449\nsquared_error = 4.042\nsamples = 667\nvalue = 3.734'), Text(0.0728385891462399, 0.325, 'squared_error = 4.994\nsamples = 100\nvalue = 1.377'), Text(0.07355887185720396, 0.325, 'latitude <= -53.0\nsquared_error = 2.721\nsamples = 567\nvalue = 4.15'), Text(0.07319873050172193, 0.275, 'squared_error = 4.995\nsamples = 131\nvalue = 3.44'), Text(0.07391901321268599, 0.275, 'latitude <= -52.501\nsquared_error = 1.841\nsamples = 436\nvalue = 4.363'), Text(0.07355887185720396, 0.225, 'latitude <= -52.817\nsquared_error = 0.195\nsamples = 271\nvalue = 4.746'), Text(0.07319873050172193, 0.175, 'squared_error = 0.212\nsamples = 102\nvalue = 4.813'), Text(0.07391901321268599, 0.175, 'squared_error = 0.181\nsamples = 169\nvalue = 4.707'), Text(0.07427915456816801, 0.225, 'squared_error = 3.906\nsamples = 165\nvalue = 3.734'), Text(0.07571971999009611, 0.425, 'latitude <= -49.478\nsquared_error = 3.637\nsamples = 691\nvalue = 0.92'), Text(0.07535957863461408, 0.375, 'longitude <= -6.077\nsquared_error = 2.781\nsamples = 551\nvalue = 0.646'), Text(0.07499943727913205, 0.325, 'squared_error = 4.358\nsamples = 163\nvalue = 1.206'), Text(0.07571971999009611, 0.325, 'longitude <= 23.25\nsquared_error = 1.932\nsamples = 388\nvalue = 0.411'), Text(0.07535957863461408, 0.275, 'latitude <= -51.042\nsquared_error = 0.68\nsamples = 285\nvalue = 0.149'), Text(0.07499943727913205, 0.225, 'squared_error = 1.743\nsamples = 105\nvalue = 0.404'), Text(0.07571971999009611, 0.225, 'squared_error = -0.0\nsamples = 180\nvalue = 0.0'), Text(0.07607986134557813, 0.275, 'squared_error = 4.679\nsamples = 103\nvalue = 1.137'), Text(0.07607986134557813, 0.375, 'squared_error = 5.546\nsamples = 140\nvalue = 1.998'), Text(0.07860085083395232, 0.475, 'latitude <= -49.477\nsquared_error = 0.767\nsamples = 1346\nvalue = 0.166'), Text(0.0782407094784703, 0.425, 'latitude <= -52.627\nsquared_error = 0.479\nsamples = 1207\nvalue = 0.1'), Text(0.07752042676750624, 0.375, 'latitude <= -53.405\nsquared_error = 1.333\nsamples = 365\nvalue = 0.29'), Text(0.07716028541202422, 0.325, 'longitude <= 72.624\nsquared_error = 0.12\nsamples = 234\nvalue = 0.023'), Text(0.07680014405654219, 0.275, 'squared_error = 0.0\nsamples = 134\nvalue = 0.0'), Text(0.07752042676750624, 0.275, 'squared_error = 0.278\nsamples = 100\nvalue = 0.053'), Text(0.07788056812298827, 0.325, 'squared_error = 3.144\nsamples = 131\nvalue = 0.769'), Text(0.07896099218943435, 0.375, 'latitude <= -49.984\nsquared_error = 0.086\nsamples = 842\nvalue = 0.017'), Text(0.07860085083395232, 0.325, 'longitude <= 41.25\nsquared_error = 0.044\nsamples = 732\nvalue = 0.008'), Text(0.0782407094784703, 0.275, 'squared_error = 0.312\nsamples = 103\nvalue = 0.055'), Text(0.07896099218943435, 0.275, 'squared_error = 0.0\nsamples = 629\nvalue = 0.0'), Text(0.07932113354491638, 0.325, 'squared_error = 0.362\nsamples = 110\nvalue = 0.082'), Text(0.07896099218943435, 0.425, 'squared_error = 2.907\nsamples = 139\nvalue = 0.737'), Text(0.0837328651495712, 0.525, 'latitude <= -50.499\nsquared_error = 5.709\nsamples = 2176\nvalue = 2.519'), Text(0.08130191100006752, 0.475, 'longitude <= 138.002\nsquared_error = 5.469\nsamples = 1122\nvalue = 1.652'), Text(0.08004141625588043, 0.425, 'longitude <= 115.391\nsquared_error = 0.938\nsamples = 426\nvalue = 0.202'), Text(0.0796812749003984, 0.375, 'squared_error = 2.127\nsamples = 131\nvalue = 0.479'), Text(0.08040155761136246, 0.375, 'latitude <= -52.36\nsquared_error = 0.361\nsamples = 295\nvalue = 0.079'), Text(0.08004141625588043, 0.325, 'squared_error = 0.0\nsamples = 147\nvalue = 0.0'), Text(0.08076169896684449, 0.325, 'squared_error = 0.706\nsamples = 148\nvalue = 0.157'), Text(0.08256240574425462, 0.425, 'longitude <= 140.995\nsquared_error = 6.167\nsamples = 696\nvalue = 2.54'), Text(0.08184212303329057, 0.375, 'longitude <= 139.526\nsquared_error = 2.909\nsamples = 249\nvalue = 4.186'), Text(0.08148198167780854, 0.325, 'squared_error = 3.814\nsamples = 101\nvalue = 3.863'), Text(0.0822022643887726, 0.325, 'squared_error = 2.172\nsamples = 148\nvalue = 4.405'), Text(0.08328268845521868, 0.375, 'longitude <= 158.551\nsquared_error = 5.632\nsamples = 447\nvalue = 1.623'), Text(0.08292254709973665, 0.325, 'latitude <= -52.675\nsquared_error = 1.932\nsamples = 261\nvalue = 0.459'), Text(0.08256240574425462, 0.275, 'squared_error = 2.724\nsamples = 106\nvalue = 0.72'), Text(0.08328268845521868, 0.275, 'squared_error = 1.312\nsamples = 155\nvalue = 0.281'), Text(0.0836428298107007, 0.325, 'squared_error = 6.258\nsamples = 186\nvalue = 3.255'), Text(0.08616381929907489, 0.475, 'longitude <= 127.965\nsquared_error = 4.314\nsamples = 1054\nvalue = 3.441'), Text(0.08544353658811084, 0.425, 'latitude <= -48.999\nsquared_error = 2.524\nsamples = 765\nvalue = 3.999'), Text(0.08508339523262881, 0.375, 'latitude <= -49.503\nsquared_error = 3.005\nsamples = 613\nvalue = 3.851'), Text(0.08436311252166476, 0.325, 'latitude <= -49.999\nsquared_error = 1.914\nsamples = 362\nvalue = 4.179'), Text(0.08400297116618273, 0.275, 'squared_error = 3.792\nsamples = 152\nvalue = 3.638'), Text(0.08472325387714678, 0.275, 'latitude <= -49.737\nsquared_error = 0.19\nsamples = 210\nvalue = 4.571'), Text(0.08436311252166476, 0.225, 'squared_error = 0.189\nsamples = 100\nvalue = 4.531'), Text(0.08508339523262881, 0.225, 'squared_error = 0.188\nsamples = 110\nvalue = 4.607'), Text(0.08580367794359287, 0.325, 'longitude <= 120.653\nsquared_error = 4.2\nsamples = 251\nvalue = 3.378'), Text(0.08544353658811084, 0.275, 'squared_error = 5.076\nsamples = 100\nvalue = 2.429'), Text(0.08616381929907489, 0.275, 'squared_error = 2.628\nsamples = 151\nvalue = 4.007'), Text(0.08580367794359287, 0.375, 'squared_error = 0.138\nsamples = 152\nvalue = 4.597'), Text(0.08688410201003895, 0.425, 'latitude <= -49.502\nsquared_error = 6.043\nsamples = 289\nvalue = 1.964'), Text(0.08652396065455692, 0.375, 'squared_error = 6.134\nsamples = 147\nvalue = 3.077'), Text(0.08724424336552097, 0.375, 'squared_error = 3.34\nsamples = 142\nvalue = 0.812'), Text(0.097913431021676, 0.575, 'longitude <= 100.452\nsquared_error = 3.684\nsamples = 7234\nvalue = 0.927'), Text(0.0944470704751615, 0.525, 'longitude <= 77.514\nsquared_error = 4.526\nsamples = 5090\nvalue = 1.224'), Text(0.09084565692034123, 0.475, 'longitude <= -10.504\nsquared_error = 3.732\nsamples = 3867\nvalue = 0.96'), Text(0.08868480878744907, 0.425, 'longitude <= -15.505\nsquared_error = 6.029\nsamples = 526\nvalue = 2.521'), Text(0.08796452607648501, 0.375, 'longitude <= -16.493\nsquared_error = 5.541\nsamples = 263\nvalue = 3.148'), Text(0.08760438472100299, 0.325, 'squared_error = 5.428\nsamples = 110\nvalue = 1.581'), Text(0.08832466743196704, 0.325, 'squared_error = 2.587\nsamples = 153\nvalue = 4.275'), Text(0.08940509149841312, 0.375, 'latitude <= -45.517\nsquared_error = 5.73\nsamples = 263\nvalue = 1.893'), Text(0.0890449501429311, 0.325, 'squared_error = 5.656\nsamples = 132\nvalue = 3.161'), Text(0.08976523285389515, 0.325, 'squared_error = 2.555\nsamples = 131\nvalue = 0.616'), Text(0.0930065050532334, 0.425, 'longitude <= 31.028\nsquared_error = 2.927\nsamples = 3341\nvalue = 0.715'), Text(0.09084565692034123, 0.375, 'longitude <= -7.75\nsquared_error = 0.272\nsamples = 1374\nvalue = 0.056'), Text(0.0904855155648592, 0.325, 'squared_error = 2.16\nsamples = 114\nvalue = 0.479'), Text(0.09120579827582326, 0.325, 'latitude <= -46.09\nsquared_error = 0.084\nsamples = 1260\nvalue = 0.018'), Text(0.0904855155648592, 0.275, 'latitude <= -47.823\nsquared_error = 0.211\nsamples = 307\nvalue = 0.046'), Text(0.09012537420937718, 0.225, 'squared_error = 0.0\nsamples = 124\nvalue = 0.0'), Text(0.09084565692034123, 0.225, 'squared_error = 0.352\nsamples = 183\nvalue = 0.077'), Text(0.09192608098678731, 0.275, 'latitude <= -40.852\nsquared_error = 0.043\nsamples = 953\nvalue = 0.009'), Text(0.09156593963130528, 0.225, 'squared_error = 0.0\nsamples = 695\nvalue = 0.0'), Text(0.09228622234226934, 0.225, 'latitude <= -39.706\nsquared_error = 0.157\nsamples = 258\nvalue = 0.034'), Text(0.09192608098678731, 0.175, 'squared_error = 0.297\nsamples = 135\nvalue = 0.066'), Text(0.09264636369775137, 0.175, 'squared_error = 0.0\nsamples = 123\nvalue = 0.0'), Text(0.09516735318612556, 0.375, 'longitude <= 46.494\nsquared_error = 4.267\nsamples = 1967\nvalue = 1.175'), Text(0.0944470704751615, 0.325, 'latitude <= -40.501\nsquared_error = 5.784\nsamples = 959\nvalue = 2.371'), Text(0.09408692911967947, 0.275, 'latitude <= -41.433\nsquared_error = 5.732\nsamples = 814\nvalue = 2.535'), Text(0.09372678776419745, 0.225, 'longitude <= 42.49\nsquared_error = 5.777\nsamples = 702\nvalue = 2.348'), Text(0.09336664640871542, 0.175, 'latitude <= -43.022\nsquared_error = 5.704\nsamples = 599\nvalue = 2.698'), Text(0.0930065050532334, 0.125, 'latitude <= -44.999\nsquared_error = 5.382\nsamples = 493\nvalue = 3.01'), Text(0.09228622234226934, 0.075, 'longitude <= 34.998\nsquared_error = 5.906\nsamples = 277\nvalue = 2.527'), Text(0.09192608098678731, 0.025, 'squared_error = 4.516\nsamples = 174\nvalue = 3.517'), Text(0.09264636369775137, 0.025, 'squared_error = 3.808\nsamples = 103\nvalue = 0.856'), Text(0.09372678776419745, 0.075, 'longitude <= 39.004\nsquared_error = 4.028\nsamples = 216\nvalue = 3.629'), Text(0.09336664640871542, 0.025, 'squared_error = 4.976\nsamples = 106\nvalue = 3.069'), Text(0.09408692911967947, 0.025, 'squared_error = 2.52\nsamples = 110\nvalue = 4.169'), Text(0.09372678776419745, 0.125, 'squared_error = 4.636\nsamples = 106\nvalue = 1.244'), Text(0.09408692911967947, 0.175, 'squared_error = 1.348\nsamples = 103\nvalue = 0.313'), Text(0.0944470704751615, 0.225, 'squared_error = 3.857\nsamples = 112\nvalue = 3.708'), Text(0.09480721183064353, 0.275, 'squared_error = 5.079\nsamples = 145\nvalue = 1.452'), Text(0.09588763589708961, 0.325, 'latitude <= -39.75\nsquared_error = 0.166\nsamples = 1008\nvalue = 0.036'), Text(0.09552749454160758, 0.275, 'longitude <= 71.02\nsquared_error = 0.076\nsamples = 907\nvalue = 0.016'), Text(0.09516735318612556, 0.225, 'squared_error = -0.0\nsamples = 718\nvalue = 0.0'), Text(0.09588763589708961, 0.225, 'squared_error = 0.36\nsamples = 189\nvalue = 0.076'), Text(0.09624777725257164, 0.275, 'squared_error = 0.94\nsamples = 101\nvalue = 0.221'), Text(0.09804848402998177, 0.475, 'longitude <= 99.004\nsquared_error = 6.122\nsamples = 1223\nvalue = 2.057'), Text(0.09768834267449975, 0.425, 'latitude <= -46.499\nsquared_error = 5.918\nsamples = 1114\nvalue = 1.898'), Text(0.09732820131901772, 0.375, 'squared_error = 1.047\nsamples = 166\nvalue = 0.211'), Text(0.09804848402998177, 0.375, 'longitude <= 80.987\nsquared_error = 6.186\nsamples = 948\nvalue = 2.193'), Text(0.09732820131901772, 0.325, 'latitude <= -41.092\nsquared_error = 6.25\nsamples = 205\nvalue = 3.162'), Text(0.09696805996353569, 0.275, 'squared_error = 7.373\nsamples = 100\nvalue = 2.568'), Text(0.09768834267449975, 0.275, 'squared_error = 4.525\nsamples = 105\nvalue = 3.728'), Text(0.09876876674094583, 0.325, 'latitude <= -41.035\nsquared_error = 5.838\nsamples = 743\nvalue = 1.926'), Text(0.0984086253854638, 0.275, 'latitude <= -42.478\nsquared_error = 6.115\nsamples = 581\nvalue = 2.383'), Text(0.09768834267449975, 0.225, 'longitude <= 95.571\nsquared_error = 5.859\nsamples = 379\nvalue = 1.883'), Text(0.09732820131901772, 0.175, 'latitude <= -43.84\nsquared_error = 3.659\nsamples = 239\nvalue = 0.942'), Text(0.09696805996353569, 0.125, 'squared_error = 2.184\nsamples = 126\nvalue = 0.498'), Text(0.09768834267449975, 0.125, 'squared_error = 4.839\nsamples = 113\nvalue = 1.437'), Text(0.09804848402998177, 0.175, 'squared_error = 5.53\nsamples = 140\nvalue = 3.488'), Text(0.09912890809642785, 0.225, 'longitude <= 87.965\nsquared_error = 5.243\nsamples = 202\nvalue = 3.322'), Text(0.09876876674094583, 0.175, 'squared_error = 4.337\nsamples = 102\nvalue = 3.704'), Text(0.09948904945190988, 0.175, 'squared_error = 5.866\nsamples = 100\nvalue = 2.932'), Text(0.09912890809642785, 0.275, 'squared_error = 1.408\nsamples = 162\nvalue = 0.286'), Text(0.0984086253854638, 0.425, 'squared_error = 5.288\nsamples = 109\nvalue = 3.686'), Text(0.10137979156819052, 0.525, 'latitude <= -47.507\nsquared_error = 0.979\nsamples = 2144\nvalue = 0.223'), Text(0.10020933216287393, 0.475, 'longitude <= 125.401\nsquared_error = 2.862\nsamples = 249\nvalue = 0.747'), Text(0.09984919080739191, 0.425, 'squared_error = 4.467\nsamples = 117\nvalue = 1.43'), Text(0.10056947351835595, 0.425, 'squared_error = 0.66\nsamples = 132\nvalue = 0.142'), Text(0.1025502509735071, 0.475, 'longitude <= 126.965\nsquared_error = 0.69\nsamples = 1895\nvalue = 0.154'), Text(0.10128975622932, 0.425, 'longitude <= 124.071\nsquared_error = 1.238\nsamples = 813\nvalue = 0.282'), Text(0.10092961487383798, 0.375, 'longitude <= 117.545\nsquared_error = 0.632\nsamples = 709\nvalue = 0.138'), Text(0.10020933216287393, 0.325, 'latitude <= -44.556\nsquared_error = 0.201\nsamples = 500\nvalue = 0.045'), Text(0.09984919080739191, 0.275, 'squared_error = 0.594\nsamples = 166\nvalue = 0.136'), Text(0.10056947351835595, 0.275, 'squared_error = -0.0\nsamples = 334\nvalue = 0.0'), Text(0.10164989758480203, 0.325, 'longitude <= 120.75\nsquared_error = 1.591\nsamples = 209\nvalue = 0.36'), Text(0.10128975622932, 0.275, 'squared_error = 2.658\nsamples = 104\nvalue = 0.638'), Text(0.10201003894028406, 0.275, 'squared_error = 0.381\nsamples = 105\nvalue = 0.086'), Text(0.10164989758480203, 0.375, 'squared_error = 4.266\nsamples = 104\nvalue = 1.265'), Text(0.10381074571769419, 0.425, 'latitude <= -40.853\nsquared_error = 0.257\nsamples = 1082\nvalue = 0.057'), Text(0.10309046300673014, 0.375, 'longitude <= 136.088\nsquared_error = 0.155\nsamples = 838\nvalue = 0.033'), Text(0.10273032165124811, 0.325, 'squared_error = 0.0\nsamples = 217\nvalue = 0.0'), Text(0.10345060436221216, 0.325, 'longitude <= 146.263\nsquared_error = 0.209\nsamples = 621\nvalue = 0.045'), Text(0.10273032165124811, 0.275, 'longitude <= 141.75\nsquared_error = 0.374\nsamples = 223\nvalue = 0.083'), Text(0.10237018029576608, 0.225, 'squared_error = 0.16\nsamples = 120\nvalue = 0.037'), Text(0.10309046300673014, 0.225, 'squared_error = 0.618\nsamples = 103\nvalue = 0.136'), Text(0.10417088707317622, 0.275, 'latitude <= -45.555\nsquared_error = 0.116\nsamples = 398\nvalue = 0.024'), Text(0.10381074571769419, 0.225, 'squared_error = 0.402\nsamples = 113\nvalue = 0.084'), Text(0.10453102842865825, 0.225, 'squared_error = 0.0\nsamples = 285\nvalue = 0.0'), Text(0.10453102842865825, 0.375, 'latitude <= -39.67\nsquared_error = 0.597\nsamples = 244\nvalue = 0.139'), Text(0.10417088707317622, 0.325, 'squared_error = 1.058\nsamples = 134\nvalue = 0.253'), Text(0.10489116978414027, 0.325, 'squared_error = 0.0\nsamples = 110\nvalue = 0.0'), Text(0.1059209489724717, 0.825, 'latitude <= -49.912\nsquared_error = 3.255\nsamples = 5203\nvalue = 3.302'), Text(0.10520066626150765, 0.775, 'latitude <= -51.75\nsquared_error = 0.155\nsamples = 552\nvalue = 0.034'), Text(0.10484052490602562, 0.725, 'squared_error = -0.0\nsamples = 447\nvalue = 0.0'), Text(0.10556080761698967, 0.725, 'squared_error = 0.788\nsamples = 105\nvalue = 0.176'), Text(0.10664123168343576, 0.775, 'longitude <= 177.48\nsquared_error = 2.204\nsamples = 4651\nvalue = 3.69'), Text(0.10628109032795373, 0.725, 'latitude <= -46.5\nsquared_error = 2.013\nsamples = 4462\nvalue = 3.753'), Text(0.1052513111396223, 0.675, 'longitude <= 166.457\nsquared_error = 5.538\nsamples = 381\nvalue = 2.945'), Text(0.10489116978414027, 0.625, 'latitude <= -48.502\nsquared_error = 2.42\nsamples = 259\nvalue = 4.266'), Text(0.10453102842865825, 0.575, 'squared_error = 1.894\nsamples = 112\nvalue = 4.788'), Text(0.1052513111396223, 0.575, 'squared_error = 2.457\nsamples = 147\nvalue = 3.869'), Text(0.10561145249510433, 0.625, 'squared_error = 0.584\nsamples = 122\nvalue = 0.14'), Text(0.10731086951628514, 0.675, 'longitude <= 166.001\nsquared_error = 1.617\nsamples = 4081\nvalue = 3.828'), Text(0.10695072816080312, 0.625, 'squared_error = 5.157\nsamples = 112\nvalue = 2.542'), Text(0.10767101087176717, 0.625, 'longitude <= 167.496\nsquared_error = 1.469\nsamples = 3969\nvalue = 3.865'), Text(0.10597159385058635, 0.575, 'latitude <= -44.933\nsquared_error = 1.005\nsamples = 622\nvalue = 4.168'), Text(0.10561145249510433, 0.525, 'longitude <= 166.946\nsquared_error = 0.406\nsamples = 522\nvalue = 4.339'), Text(0.10489116978414027, 0.475, 'latitude <= -45.382\nsquared_error = 0.367\nsamples = 307\nvalue = 4.421'), Text(0.10453102842865825, 0.425, 'squared_error = 0.298\nsamples = 163\nvalue = 4.479'), Text(0.1052513111396223, 0.425, 'squared_error = 0.437\nsamples = 144\nvalue = 4.354'), Text(0.10633173520606838, 0.475, 'latitude <= -45.163\nsquared_error = 0.438\nsamples = 215\nvalue = 4.222'), Text(0.10597159385058635, 0.425, 'squared_error = 0.587\nsamples = 115\nvalue = 4.165'), Text(0.10669187656155041, 0.425, 'squared_error = 0.258\nsamples = 100\nvalue = 4.287'), Text(0.10633173520606838, 0.525, 'squared_error = 3.191\nsamples = 100\nvalue = 3.277'), Text(0.10937042789294799, 0.575, 'latitude <= -44.986\nsquared_error = 1.535\nsamples = 3347\nvalue = 3.808'), Text(0.10901028653746596, 0.525, 'squared_error = 4.509\nsamples = 100\nvalue = 1.933'), Text(0.10973056924843001, 0.525, 'longitude <= 171.505\nsquared_error = 1.332\nsamples = 3247\nvalue = 3.866'), Text(0.10777230062799649, 0.475, 'latitude <= -43.209\nsquared_error = 3.769\nsamples = 325\nvalue = 3.146'), Text(0.10741215927251446, 0.425, 'longitude <= 168.492\nsquared_error = 1.894\nsamples = 225\nvalue = 3.876'), Text(0.10705201791703244, 0.375, 'squared_error = 1.167\nsamples = 101\nvalue = 4.044'), Text(0.10777230062799649, 0.375, 'squared_error = 2.445\nsamples = 124\nvalue = 3.739'), Text(0.10813244198347852, 0.425, 'squared_error = 4.095\nsamples = 100\nvalue = 1.504'), Text(0.11168883786886354, 0.475, 'longitude <= 174.49\nsquared_error = 0.997\nsamples = 2922\nvalue = 3.946'), Text(0.10948297206653612, 0.425, 'latitude <= -41.5\nsquared_error = 0.846\nsamples = 1744\nvalue = 4.065'), Text(0.10849258333896054, 0.375, 'latitude <= -43.622\nsquared_error = 0.696\nsamples = 1247\nvalue = 4.167'), Text(0.10813244198347852, 0.325, 'squared_error = 1.633\nsamples = 100\nvalue = 3.759'), Text(0.10885272469444257, 0.325, 'longitude <= 174.2\nsquared_error = 0.598\nsamples = 1147\nvalue = 4.202'), Text(0.1079523713057375, 0.275, 'latitude <= -42.002\nsquared_error = 0.669\nsamples = 922\nvalue = 4.176'), Text(0.10723208859477344, 0.225, 'latitude <= -42.448\nsquared_error = 0.611\nsamples = 717\nvalue = 4.226'), Text(0.10687194723929143, 0.175, 'longitude <= 172.94\nsquared_error = 0.678\nsamples = 527\nvalue = 4.165'), Text(0.1065118058838094, 0.125, 'longitude <= 172.742\nsquared_error = 0.411\nsamples = 427\nvalue = 4.211'), Text(0.10615166452832737, 0.075, 'latitude <= -43.583\nsquared_error = 0.517\nsamples = 285\nvalue = 4.176'), Text(0.10579152317284535, 0.025, 'squared_error = 0.159\nsamples = 124\nvalue = 4.265'), Text(0.1065118058838094, 0.025, 'squared_error = 0.781\nsamples = 161\nvalue = 4.107'), Text(0.10687194723929143, 0.075, 'squared_error = 0.193\nsamples = 142\nvalue = 4.283'), Text(0.10723208859477344, 0.125, 'squared_error = 1.769\nsamples = 100\nvalue = 3.964'), Text(0.10759222995025547, 0.175, 'squared_error = 0.383\nsamples = 190\nvalue = 4.395'), Text(0.10867265401670155, 0.225, 'longitude <= 173.999\nsquared_error = 0.835\nsamples = 205\nvalue = 4.003'), Text(0.10831251266121952, 0.175, 'squared_error = 1.082\nsamples = 104\nvalue = 3.873'), Text(0.10903279537218358, 0.175, 'squared_error = 0.546\nsamples = 101\nvalue = 4.137'), Text(0.10975307808314763, 0.275, 'latitude <= -41.687\nsquared_error = 0.294\nsamples = 225\nvalue = 4.309'), Text(0.1093929367276656, 0.225, 'squared_error = 0.296\nsamples = 123\nvalue = 4.359'), Text(0.11011321943862966, 0.225, 'squared_error = 0.284\nsamples = 102\nvalue = 4.248'), Text(0.11047336079411169, 0.375, 'longitude <= 173.167\nsquared_error = 1.134\nsamples = 497\nvalue = 3.812'), Text(0.11011321943862966, 0.325, 'squared_error = 2.296\nsamples = 100\nvalue = 3.353'), Text(0.11083350214959371, 0.325, 'latitude <= -40.955\nsquared_error = 0.774\nsamples = 397\nvalue = 3.927'), Text(0.11047336079411169, 0.275, 'squared_error = 0.971\nsamples = 115\nvalue = 3.804'), Text(0.11119364350507574, 0.275, 'longitude <= 173.995\nsquared_error = 0.685\nsamples = 282\nvalue = 3.977'), Text(0.11083350214959371, 0.225, 'squared_error = 0.859\nsamples = 110\nvalue = 4.046'), Text(0.11155378486055777, 0.225, 'squared_error = 0.569\nsamples = 172\nvalue = 3.933'), Text(0.11389470367119094, 0.425, 'latitude <= -41.456\nsquared_error = 1.168\nsamples = 1178\nvalue = 3.769'), Text(0.11353456231570891, 0.375, 'squared_error = 3.702\nsamples = 100\nvalue = 2.597'), Text(0.11425484502667296, 0.375, 'longitude <= 175.683\nsquared_error = 0.793\nsamples = 1078\nvalue = 3.878'), Text(0.1133544916379679, 0.325, 'longitude <= 174.964\nsquared_error = 0.666\nsamples = 608\nvalue = 3.724'), Text(0.11263420892700385, 0.275, 'latitude <= -39.797\nsquared_error = 0.45\nsamples = 303\nvalue = 3.853'), Text(0.11227406757152182, 0.225, 'squared_error = 0.429\nsamples = 197\nvalue = 3.761'), Text(0.11299435028248588, 0.225, 'squared_error = 0.445\nsamples = 106\nvalue = 4.025'), Text(0.11407477434893196, 0.275, 'longitude <= 175.279\nsquared_error = 0.848\nsamples = 305\nvalue = 3.596'), Text(0.11371463299344993, 0.225, 'squared_error = 0.682\nsamples = 188\nvalue = 3.668'), Text(0.11443491570441398, 0.225, 'squared_error = 1.095\nsamples = 117\nvalue = 3.481'), Text(0.11515519841537804, 0.325, 'longitude <= 176.022\nsquared_error = 0.887\nsamples = 470\nvalue = 4.077'), Text(0.11479505705989601, 0.275, 'squared_error = 1.396\nsamples = 101\nvalue = 3.951'), Text(0.11551533977086006, 0.275, 'longitude <= 176.484\nsquared_error = 0.742\nsamples = 369\nvalue = 4.111'), Text(0.11515519841537804, 0.225, 'squared_error = 0.497\nsamples = 115\nvalue = 4.257'), Text(0.11587548112634209, 0.225, 'latitude <= -39.985\nsquared_error = 0.84\nsamples = 254\nvalue = 4.045'), Text(0.11551533977086006, 0.175, 'squared_error = 0.856\nsamples = 140\nvalue = 3.999'), Text(0.11623562248182412, 0.175, 'squared_error = 0.814\nsamples = 114\nvalue = 4.102'), Text(0.10700137303891777, 0.725, 'squared_error = 4.427\nsamples = 189\nvalue = 2.206'), Text(0.7909124613393179, 0.925, 'latitude <= 65.0\nsquared_error = 2.986\nsamples = 769518\nvalue = 3.122'), Text(0.6286563118113704, 0.875, 'longitude <= 119.001\nsquared_error = 2.727\nsamples = 733978\nvalue = 3.239'), Text(0.3811256123106444, 0.825, 'longitude <= -172.5\nsquared_error = 2.553\nsamples = 556081\nvalue = 2.979'), Text(0.16339585162176154, 0.775, 'latitude <= -14.024\nsquared_error = 1.639\nsamples = 44591\nvalue = 4.131'), Text(0.14364364575595923, 0.725, 'latitude <= -35.492\nsquared_error = 0.657\nsamples = 32104\nvalue = 4.575'), Text(0.13593929367276655, 0.675, 'longitude <= -179.005\nsquared_error = 3.385\nsamples = 462\nvalue = 3.627'), Text(0.13557915231728454, 0.625, 'latitude <= -36.995\nsquared_error = 0.851\nsamples = 360\nvalue = 4.376'), Text(0.1352190109618025, 0.575, 'squared_error = 1.04\nsamples = 140\nvalue = 4.146'), Text(0.13593929367276655, 0.575, 'latitude <= -36.523\nsquared_error = 0.677\nsamples = 220\nvalue = 4.521'), Text(0.13557915231728454, 0.525, 'squared_error = 0.21\nsamples = 111\nvalue = 4.605'), Text(0.1362994350282486, 0.525, 'squared_error = 1.137\nsamples = 109\nvalue = 4.436'), Text(0.1362994350282486, 0.625, 'squared_error = 3.376\nsamples = 102\nvalue = 0.986'), Text(0.15134799783915187, 0.675, 'longitude <= -179.987\nsquared_error = 0.604\nsamples = 31642\nvalue = 4.589'), Text(0.15098785648366983, 0.625, 'squared_error = 4.505\nsamples = 100\nvalue = 3.177'), Text(0.15170813919463388, 0.625, 'longitude <= -177.495\nsquared_error = 0.586\nsamples = 31542\nvalue = 4.593'), Text(0.13737985909469466, 0.575, 'longitude <= -177.506\nsquared_error = 0.455\nsamples = 16955\nvalue = 4.526'), Text(0.13701971773921265, 0.525, 'latitude <= -29.663\nsquared_error = 0.413\nsamples = 16850\nvalue = 4.536'), Text(0.12377608211222905, 0.475, 'longitude <= -178.419\nsquared_error = 0.427\nsamples = 4618\nvalue = 4.688'), Text(0.12091746010309046, 0.425, 'latitude <= -31.091\nsquared_error = 0.457\nsamples = 2487\nvalue = 4.593'), Text(0.11947689468116236, 0.375, 'longitude <= -178.5\nsquared_error = 0.42\nsamples = 2004\nvalue = 4.625'), Text(0.11911675332568034, 0.325, 'longitude <= -179.498\nsquared_error = 0.35\nsamples = 1852\nvalue = 4.64'), Text(0.11767618790375223, 0.275, 'latitude <= -32.1\nsquared_error = 0.607\nsamples = 407\nvalue = 4.544'), Text(0.1173160465482702, 0.225, 'longitude <= -179.752\nsquared_error = 0.593\nsamples = 293\nvalue = 4.601'), Text(0.11695590519278817, 0.175, 'squared_error = 0.135\nsamples = 120\nvalue = 4.529'), Text(0.11767618790375223, 0.175, 'squared_error = 0.904\nsamples = 173\nvalue = 4.651'), Text(0.11803632925923425, 0.225, 'squared_error = 0.612\nsamples = 114\nvalue = 4.397'), Text(0.12055731874760843, 0.275, 'latitude <= -33.403\nsquared_error = 0.275\nsamples = 1445\nvalue = 4.667'), Text(0.11911675332568034, 0.225, 'longitude <= -178.993\nsquared_error = 0.265\nsamples = 566\nvalue = 4.597'), Text(0.11839647061471628, 0.175, 'longitude <= -179.205\nsquared_error = 0.42\nsamples = 254\nvalue = 4.557'), Text(0.11803632925923425, 0.125, 'squared_error = 0.185\nsamples = 148\nvalue = 4.651'), Text(0.11875661197019831, 0.125, 'squared_error = 0.719\nsamples = 106\nvalue = 4.425'), Text(0.11983703603664439, 0.175, 'longitude <= -178.779\nsquared_error = 0.136\nsamples = 312\nvalue = 4.63'), Text(0.11947689468116236, 0.125, 'squared_error = 0.174\nsamples = 139\nvalue = 4.688'), Text(0.1201971773921264, 0.125, 'squared_error = 0.1\nsamples = 173\nvalue = 4.584'), Text(0.12199788416953654, 0.225, 'latitude <= -32.508\nsquared_error = 0.276\nsamples = 879\nvalue = 4.712'), Text(0.12127760145857248, 0.175, 'longitude <= -179.004\nsquared_error = 0.224\nsamples = 484\nvalue = 4.754'), Text(0.12091746010309046, 0.125, 'squared_error = 0.235\nsamples = 181\nvalue = 4.846'), Text(0.12163774281405451, 0.125, 'longitude <= -178.715\nsquared_error = 0.209\nsamples = 303\nvalue = 4.698'), Text(0.12127760145857248, 0.075, 'squared_error = 0.315\nsamples = 130\nvalue = 4.639'), Text(0.12199788416953654, 0.075, 'squared_error = 0.124\nsamples = 173\nvalue = 4.743'), Text(0.12271816688050059, 0.175, 'longitude <= -178.995\nsquared_error = 0.336\nsamples = 395\nvalue = 4.66'), Text(0.12235802552501857, 0.125, 'squared_error = 0.546\nsamples = 164\nvalue = 4.561'), Text(0.12307830823598262, 0.125, 'latitude <= -31.851\nsquared_error = 0.174\nsamples = 231\nvalue = 4.731'), Text(0.12271816688050059, 0.075, 'squared_error = 0.153\nsamples = 104\nvalue = 4.707'), Text(0.12343844959146465, 0.075, 'squared_error = 0.191\nsamples = 127\nvalue = 4.75'), Text(0.11983703603664439, 0.325, 'squared_error = 1.232\nsamples = 152\nvalue = 4.441'), Text(0.12235802552501857, 0.375, 'longitude <= -178.997\nsquared_error = 0.591\nsamples = 483\nvalue = 4.459'), Text(0.12163774281405451, 0.325, 'longitude <= -179.331\nsquared_error = 0.567\nsamples = 266\nvalue = 4.345'), Text(0.12127760145857248, 0.275, 'squared_error = 0.48\nsamples = 146\nvalue = 4.407'), Text(0.12199788416953654, 0.275, 'squared_error = 0.661\nsamples = 120\nvalue = 4.269'), Text(0.12307830823598262, 0.325, 'longitude <= -178.701\nsquared_error = 0.586\nsamples = 217\nvalue = 4.6'), Text(0.12271816688050059, 0.275, 'squared_error = 0.305\nsamples = 102\nvalue = 4.671'), Text(0.12343844959146465, 0.275, 'squared_error = 0.826\nsamples = 115\nvalue = 4.537'), Text(0.12663470412136762, 0.425, 'latitude <= -32.464\nsquared_error = 0.368\nsamples = 2131\nvalue = 4.799'), Text(0.12487901501339276, 0.375, 'longitude <= -177.996\nsquared_error = 0.405\nsamples = 521\nvalue = 4.66'), Text(0.12451887365791073, 0.325, 'longitude <= -178.188\nsquared_error = 0.423\nsamples = 421\nvalue = 4.629'), Text(0.1241587323024287, 0.275, 'latitude <= -33.015\nsquared_error = 0.153\nsamples = 295\nvalue = 4.679'), Text(0.12379859094694667, 0.225, 'squared_error = 0.139\nsamples = 153\nvalue = 4.64'), Text(0.12451887365791073, 0.225, 'squared_error = 0.164\nsamples = 142\nvalue = 4.72'), Text(0.12487901501339276, 0.275, 'squared_error = 1.038\nsamples = 126\nvalue = 4.512'), Text(0.12523915636887478, 0.325, 'squared_error = 0.305\nsamples = 100\nvalue = 4.793'), Text(0.1283903932293425, 0.375, 'latitude <= -30.949\nsquared_error = 0.347\nsamples = 1610\nvalue = 4.844'), Text(0.12631958043532085, 0.325, 'latitude <= -32.014\nsquared_error = 0.305\nsamples = 665\nvalue = 4.789'), Text(0.12559929772435682, 0.275, 'latitude <= -32.271\nsquared_error = 0.256\nsamples = 217\nvalue = 4.844'), Text(0.12523915636887478, 0.225, 'squared_error = 0.208\nsamples = 108\nvalue = 4.775'), Text(0.12595943907983884, 0.225, 'squared_error = 0.294\nsamples = 109\nvalue = 4.912'), Text(0.1270398631462849, 0.275, 'longitude <= -177.98\nsquared_error = 0.327\nsamples = 448\nvalue = 4.763'), Text(0.1266797217908029, 0.225, 'squared_error = 0.503\nsamples = 189\nvalue = 4.667'), Text(0.12740000450176694, 0.225, 'longitude <= -177.785\nsquared_error = 0.187\nsamples = 259\nvalue = 4.833'), Text(0.1270398631462849, 0.175, 'squared_error = 0.213\nsamples = 112\nvalue = 4.881'), Text(0.12776014585724896, 0.175, 'squared_error = 0.164\nsamples = 147\nvalue = 4.796'), Text(0.13046120602336417, 0.325, 'longitude <= -177.675\nsquared_error = 0.373\nsamples = 945\nvalue = 4.883'), Text(0.1295608526346591, 0.275, 'latitude <= -30.516\nsquared_error = 0.423\nsamples = 709\nvalue = 4.923'), Text(0.12884056992369505, 0.225, 'longitude <= -178.069\nsquared_error = 0.403\nsamples = 227\nvalue = 5.019'), Text(0.128480428568213, 0.175, 'squared_error = 0.542\nsamples = 103\nvalue = 5.166'), Text(0.12920071127917707, 0.175, 'squared_error = 0.255\nsamples = 124\nvalue = 4.898'), Text(0.13028113534562316, 0.225, 'longitude <= -177.994\nsquared_error = 0.426\nsamples = 482\nvalue = 4.878'), Text(0.12992099399014112, 0.175, 'squared_error = 0.48\nsamples = 177\nvalue = 4.676'), Text(0.13064127670110517, 0.175, 'latitude <= -30.279\nsquared_error = 0.357\nsamples = 305\nvalue = 4.995'), Text(0.13028113534562316, 0.125, 'squared_error = 0.177\nsamples = 111\nvalue = 4.864'), Text(0.13100141805658722, 0.125, 'squared_error = 0.444\nsamples = 194\nvalue = 5.071'), Text(0.13136155941206923, 0.275, 'longitude <= -177.593\nsquared_error = 0.204\nsamples = 236\nvalue = 4.763'), Text(0.13100141805658722, 0.225, 'squared_error = 0.247\nsamples = 119\nvalue = 4.814'), Text(0.13172170076755127, 0.225, 'squared_error = 0.153\nsamples = 117\nvalue = 4.71'), Text(0.15026335336619623, 0.475, 'latitude <= -17.594\nsquared_error = 0.396\nsamples = 12232\nvalue = 4.478'), Text(0.14269475769239426, 0.425, 'longitude <= -178.501\nsquared_error = 0.374\nsamples = 10735\nvalue = 4.493'), Text(0.13523307898350104, 0.375, 'latitude <= -25.252\nsquared_error = 0.368\nsamples = 5541\nvalue = 4.532'), Text(0.13298219551173834, 0.325, 'longitude <= -178.998\nsquared_error = 0.926\nsamples = 362\nvalue = 4.275'), Text(0.13262205415625633, 0.275, 'squared_error = 1.469\nsamples = 197\nvalue = 4.126'), Text(0.13334233686722038, 0.275, 'squared_error = 0.219\nsamples = 165\nvalue = 4.452'), Text(0.1374839624552637, 0.325, 'latitude <= -22.5\nsquared_error = 0.324\nsamples = 5179\nvalue = 4.55'), Text(0.13406261957818444, 0.275, 'longitude <= -179.684\nsquared_error = 0.265\nsamples = 1548\nvalue = 4.503'), Text(0.13280212483399734, 0.225, 'latitude <= -24.189\nsquared_error = 0.157\nsamples = 1000\nvalue = 4.549'), Text(0.13208184212303328, 0.175, 'longitude <= -179.901\nsquared_error = 0.102\nsamples = 249\nvalue = 4.478'), Text(0.13172170076755127, 0.125, 'squared_error = 0.084\nsamples = 106\nvalue = 4.502'), Text(0.13244198347851532, 0.125, 'squared_error = 0.115\nsamples = 143\nvalue = 4.459'), Text(0.1335224075449614, 0.175, 'latitude <= -23.312\nsquared_error = 0.173\nsamples = 751\nvalue = 4.572'), Text(0.13316226618947938, 0.125, 'longitude <= -179.772\nsquared_error = 0.178\nsamples = 651\nvalue = 4.591'), Text(0.13280212483399734, 0.075, 'longitude <= -179.904\nsquared_error = 0.191\nsamples = 526\nvalue = 4.61'), Text(0.13244198347851532, 0.025, 'squared_error = 0.203\nsamples = 214\nvalue = 4.568'), Text(0.13316226618947938, 0.025, 'squared_error = 0.181\nsamples = 312\nvalue = 4.639'), Text(0.1335224075449614, 0.075, 'squared_error = 0.114\nsamples = 125\nvalue = 4.51'), Text(0.13388254890044343, 0.125, 'squared_error = 0.121\nsamples = 100\nvalue = 4.452'), Text(0.13532311432237154, 0.225, 'latitude <= -23.0\nsquared_error = 0.451\nsamples = 548\nvalue = 4.418'), Text(0.1349629729668895, 0.175, 'latitude <= -23.41\nsquared_error = 0.331\nsamples = 448\nvalue = 4.443'), Text(0.1346028316114075, 0.125, 'latitude <= -24.188\nsquared_error = 0.361\nsamples = 348\nvalue = 4.413'), Text(0.13424269025592545, 0.075, 'squared_error = 0.438\nsamples = 157\nvalue = 4.466'), Text(0.1349629729668895, 0.075, 'squared_error = 0.293\nsamples = 191\nvalue = 4.369'), Text(0.13532311432237154, 0.125, 'squared_error = 0.213\nsamples = 100\nvalue = 4.547'), Text(0.13568325567785355, 0.175, 'squared_error = 0.977\nsamples = 100\nvalue = 4.308'), Text(0.14090530533234294, 0.275, 'latitude <= -20.744\nsquared_error = 0.348\nsamples = 3631\nvalue = 4.571'), Text(0.13784410381074572, 0.225, 'longitude <= -179.104\nsquared_error = 0.349\nsamples = 1740\nvalue = 4.633'), Text(0.1364035383888176, 0.175, 'longitude <= -179.621\nsquared_error = 0.35\nsamples = 935\nvalue = 4.68'), Text(0.1360433970333356, 0.125, 'squared_error = 0.197\nsamples = 167\nvalue = 4.558'), Text(0.13676367974429965, 0.125, 'longitude <= -179.501\nsquared_error = 0.38\nsamples = 768\nvalue = 4.706'), Text(0.1360433970333356, 0.075, 'latitude <= -22.127\nsquared_error = 0.264\nsamples = 208\nvalue = 4.811'), Text(0.13568325567785355, 0.025, 'squared_error = 0.152\nsamples = 104\nvalue = 4.762'), Text(0.1364035383888176, 0.025, 'squared_error = 0.371\nsamples = 104\nvalue = 4.861'), Text(0.1374839624552637, 0.075, 'latitude <= -21.176\nsquared_error = 0.417\nsamples = 560\nvalue = 4.667'), Text(0.13712382109978166, 0.025, 'squared_error = 0.383\nsamples = 453\nvalue = 4.69'), Text(0.13784410381074572, 0.025, 'squared_error = 0.554\nsamples = 107\nvalue = 4.572'), Text(0.13928466923267382, 0.175, 'latitude <= -21.215\nsquared_error = 0.341\nsamples = 805\nvalue = 4.578'), Text(0.13856438652170977, 0.125, 'longitude <= -178.958\nsquared_error = 0.364\nsamples = 280\nvalue = 4.461'), Text(0.13820424516622776, 0.075, 'squared_error = 0.614\nsamples = 102\nvalue = 4.368'), Text(0.1389245278771918, 0.075, 'squared_error = 0.213\nsamples = 178\nvalue = 4.514'), Text(0.14000495194363788, 0.125, 'longitude <= -178.874\nsquared_error = 0.318\nsamples = 525\nvalue = 4.641'), Text(0.13964481058815584, 0.075, 'squared_error = 0.404\nsamples = 149\nvalue = 4.579'), Text(0.1403650932991199, 0.075, 'longitude <= -178.631\nsquared_error = 0.281\nsamples = 376\nvalue = 4.665'), Text(0.14000495194363788, 0.025, 'squared_error = 0.294\nsamples = 263\nvalue = 4.705'), Text(0.14072523465460193, 0.025, 'squared_error = 0.24\nsamples = 113\nvalue = 4.573'), Text(0.14396650685394016, 0.225, 'latitude <= -18.379\nsquared_error = 0.341\nsamples = 1891\nvalue = 4.514'), Text(0.14252594143201205, 0.175, 'latitude <= -20.045\nsquared_error = 0.631\nsamples = 553\nvalue = 4.404'), Text(0.14216580007653004, 0.125, 'latitude <= -20.414\nsquared_error = 0.369\nsamples = 411\nvalue = 4.455'), Text(0.141805658721048, 0.075, 'latitude <= -20.599\nsquared_error = 0.34\nsamples = 265\nvalue = 4.398'), Text(0.141445517365566, 0.025, 'squared_error = 0.21\nsamples = 165\nvalue = 4.473'), Text(0.14216580007653004, 0.025, 'squared_error = 0.528\nsamples = 100\nvalue = 4.275'), Text(0.14252594143201205, 0.075, 'squared_error = 0.406\nsamples = 146\nvalue = 4.559'), Text(0.1428860827874941, 0.125, 'squared_error = 1.358\nsamples = 142\nvalue = 4.256'), Text(0.14540707227586827, 0.175, 'latitude <= -17.782\nsquared_error = 0.214\nsamples = 1338\nvalue = 4.559'), Text(0.14396650685394016, 0.125, 'longitude <= -178.654\nsquared_error = 0.224\nsamples = 775\nvalue = 4.61'), Text(0.1432462241429761, 0.075, 'latitude <= -17.95\nsquared_error = 0.258\nsamples = 345\nvalue = 4.645'), Text(0.1428860827874941, 0.025, 'squared_error = 0.205\nsamples = 126\nvalue = 4.563'), Text(0.14360636549845815, 0.025, 'squared_error = 0.283\nsamples = 219\nvalue = 4.691'), Text(0.14468678956490422, 0.075, 'longitude <= -178.552\nsquared_error = 0.194\nsamples = 430\nvalue = 4.581'), Text(0.1443266482094222, 0.025, 'squared_error = 0.185\nsamples = 278\nvalue = 4.544'), Text(0.14504693092038626, 0.025, 'squared_error = 0.203\nsamples = 152\nvalue = 4.65'), Text(0.14684763769779638, 0.125, 'longitude <= -178.735\nsquared_error = 0.192\nsamples = 563\nvalue = 4.489'), Text(0.14612735498683233, 0.075, 'latitude <= -17.696\nsquared_error = 0.192\nsamples = 298\nvalue = 4.524'), Text(0.1457672136313503, 0.025, 'squared_error = 0.226\nsamples = 119\nvalue = 4.575'), Text(0.14648749634231437, 0.025, 'squared_error = 0.167\nsamples = 179\nvalue = 4.491'), Text(0.14756792040876043, 0.075, 'latitude <= -17.709\nsquared_error = 0.188\nsamples = 265\nvalue = 4.45'), Text(0.14720777905327842, 0.025, 'squared_error = 0.13\nsamples = 149\nvalue = 4.399'), Text(0.14792806176424247, 0.025, 'squared_error = 0.254\nsamples = 116\nvalue = 4.516'), Text(0.1501564364012875, 0.375, 'longitude <= -178.491\nsquared_error = 0.377\nsamples = 5194\nvalue = 4.451'), Text(0.14979629504580547, 0.325, 'squared_error = 3.229\nsamples = 100\nvalue = 3.639'), Text(0.15051657775676952, 0.325, 'latitude <= -27.5\nsquared_error = 0.308\nsamples = 5094\nvalue = 4.466'), Text(0.1482882031197245, 0.275, 'longitude <= -177.694\nsquared_error = 0.592\nsamples = 397\nvalue = 4.661'), Text(0.14792806176424247, 0.225, 'latitude <= -28.368\nsquared_error = 0.573\nsamples = 295\nvalue = 4.604'), Text(0.14756792040876043, 0.175, 'squared_error = 0.559\nsamples = 193\nvalue = 4.537'), Text(0.1482882031197245, 0.175, 'squared_error = 0.577\nsamples = 102\nvalue = 4.731'), Text(0.14864834447520653, 0.225, 'squared_error = 0.61\nsamples = 102\nvalue = 4.825'), Text(0.15274495239381458, 0.275, 'longitude <= -178.005\nsquared_error = 0.28\nsamples = 4697\nvalue = 4.45'), Text(0.15071915726922816, 0.225, 'longitude <= -178.4\nsquared_error = 0.22\nsamples = 2368\nvalue = 4.48'), Text(0.14900848583068854, 0.175, 'longitude <= -178.431\nsquared_error = 0.243\nsamples = 521\nvalue = 4.518'), Text(0.14864834447520653, 0.125, 'latitude <= -20.402\nsquared_error = 0.175\nsamples = 355\nvalue = 4.47'), Text(0.1482882031197245, 0.075, 'squared_error = 0.188\nsamples = 108\nvalue = 4.531'), Text(0.14900848583068854, 0.075, 'latitude <= -18.032\nsquared_error = 0.167\nsamples = 247\nvalue = 4.443'), Text(0.14864834447520653, 0.025, 'squared_error = 0.184\nsamples = 100\nvalue = 4.385'), Text(0.14936862718617058, 0.025, 'squared_error = 0.152\nsamples = 147\nvalue = 4.482'), Text(0.14936862718617058, 0.125, 'squared_error = 0.374\nsamples = 166\nvalue = 4.622'), Text(0.1524298287077678, 0.175, 'latitude <= -18.073\nsquared_error = 0.212\nsamples = 1847\nvalue = 4.469'), Text(0.1511693339635807, 0.125, 'latitude <= -18.312\nsquared_error = 0.225\nsamples = 1385\nvalue = 4.483'), Text(0.15044905125261665, 0.075, 'latitude <= -18.737\nsquared_error = 0.211\nsamples = 1088\nvalue = 4.458'), Text(0.15008890989713464, 0.025, 'squared_error = 0.211\nsamples = 978\nvalue = 4.472'), Text(0.1508091926080987, 0.025, 'squared_error = 0.193\nsamples = 110\nvalue = 4.335'), Text(0.15188961667454476, 0.075, 'latitude <= -18.125\nsquared_error = 0.266\nsamples = 297\nvalue = 4.574'), Text(0.15152947531906275, 0.025, 'squared_error = 0.207\nsamples = 196\nvalue = 4.548'), Text(0.15224975803002677, 0.025, 'squared_error = 0.377\nsamples = 101\nvalue = 4.623'), Text(0.15369032345195488, 0.125, 'latitude <= -17.797\nsquared_error = 0.171\nsamples = 462\nvalue = 4.426'), Text(0.15333018209647287, 0.075, 'latitude <= -17.912\nsquared_error = 0.154\nsamples = 349\nvalue = 4.402'), Text(0.15297004074099083, 0.025, 'squared_error = 0.172\nsamples = 226\nvalue = 4.438'), Text(0.15369032345195488, 0.025, 'squared_error = 0.113\nsamples = 123\nvalue = 4.335'), Text(0.15405046480743692, 0.075, 'squared_error = 0.218\nsamples = 113\nvalue = 4.499'), Text(0.15477074751840098, 0.225, 'longitude <= -177.989\nsquared_error = 0.34\nsamples = 2329\nvalue = 4.42'), Text(0.15441060616291893, 0.175, 'squared_error = 3.017\nsamples = 101\nvalue = 3.562'), Text(0.155130888873883, 0.175, 'latitude <= -25.191\nsquared_error = 0.183\nsamples = 2228\nvalue = 4.459'), Text(0.15477074751840098, 0.125, 'squared_error = 0.355\nsamples = 153\nvalue = 4.744'), Text(0.15549103022936503, 0.125, 'longitude <= -177.929\nsquared_error = 0.164\nsamples = 2075\nvalue = 4.438'), Text(0.15477074751840098, 0.075, 'latitude <= -19.37\nsquared_error = 0.178\nsamples = 315\nvalue = 4.49'), Text(0.15441060616291893, 0.025, 'squared_error = 0.168\nsamples = 170\nvalue = 4.452'), Text(0.155130888873883, 0.025, 'squared_error = 0.187\nsamples = 145\nvalue = 4.533'), Text(0.15621131294032908, 0.075, 'latitude <= -21.925\nsquared_error = 0.161\nsamples = 1760\nvalue = 4.429'), Text(0.15585117158484704, 0.025, 'squared_error = 0.196\nsamples = 110\nvalue = 4.533'), Text(0.1565714542958111, 0.025, 'squared_error = 0.158\nsamples = 1650\nvalue = 4.422'), Text(0.1578319490399982, 0.425, 'latitude <= -16.498\nsquared_error = 0.54\nsamples = 1497\nvalue = 4.374'), Text(0.15693159565129314, 0.375, 'latitude <= -17.028\nsquared_error = 0.36\nsamples = 997\nvalue = 4.291'), Text(0.1565714542958111, 0.325, 'latitude <= -17.502\nsquared_error = 0.226\nsamples = 853\nvalue = 4.327'), Text(0.15585117158484704, 0.275, 'latitude <= -17.561\nsquared_error = 0.201\nsamples = 279\nvalue = 4.394'), Text(0.15549103022936503, 0.225, 'squared_error = 0.198\nsamples = 105\nvalue = 4.327'), Text(0.15621131294032908, 0.225, 'squared_error = 0.199\nsamples = 174\nvalue = 4.435'), Text(0.15729173700677515, 0.275, 'latitude <= -17.466\nsquared_error = 0.234\nsamples = 574\nvalue = 4.294'), Text(0.15693159565129314, 0.225, 'squared_error = 0.649\nsamples = 100\nvalue = 4.201'), Text(0.1576518783622572, 0.225, 'longitude <= -179.0\nsquared_error = 0.145\nsamples = 474\nvalue = 4.313'), Text(0.15729173700677515, 0.175, 'squared_error = 0.187\nsamples = 139\nvalue = 4.347'), Text(0.1580120197177392, 0.175, 'longitude <= -178.709\nsquared_error = 0.127\nsamples = 335\nvalue = 4.299'), Text(0.1576518783622572, 0.125, 'squared_error = 0.11\nsamples = 160\nvalue = 4.258'), Text(0.15837216107322125, 0.125, 'squared_error = 0.139\nsamples = 175\nvalue = 4.337'), Text(0.15729173700677515, 0.325, 'squared_error = 1.104\nsamples = 144\nvalue = 4.083'), Text(0.15873230242870326, 0.375, 'latitude <= -15.075\nsquared_error = 0.86\nsamples = 500\nvalue = 4.537'), Text(0.15837216107322125, 0.325, 'longitude <= -178.801\nsquared_error = 0.616\nsamples = 374\nvalue = 4.649'), Text(0.1580120197177392, 0.275, 'squared_error = 0.711\nsamples = 121\nvalue = 4.875'), Text(0.15873230242870326, 0.275, 'latitude <= -15.826\nsquared_error = 0.535\nsamples = 253\nvalue = 4.542'), Text(0.15837216107322125, 0.225, 'squared_error = 0.567\nsamples = 105\nvalue = 4.676'), Text(0.1590924437841853, 0.225, 'squared_error = 0.49\nsamples = 148\nvalue = 4.446'), Text(0.1590924437841853, 0.325, 'squared_error = 1.434\nsamples = 126\nvalue = 4.205'), Text(0.1377400004501767, 0.525, 'squared_error = 4.721\nsamples = 105\nvalue = 2.958'), Text(0.1660364192945731, 0.575, 'latitude <= -31.497\nsquared_error = 0.726\nsamples = 14587\nvalue = 4.671'), Text(0.1644045287775452, 0.525, 'longitude <= -176.783\nsquared_error = 4.378\nsamples = 210\nvalue = 3.389'), Text(0.16404438742206315, 0.475, 'squared_error = 1.418\nsamples = 110\nvalue = 4.366'), Text(0.1647646701330272, 0.475, 'squared_error = 5.425\nsamples = 100\nvalue = 2.313'), Text(0.16766830981160105, 0.525, 'latitude <= -30.499\nsquared_error = 0.648\nsamples = 14377\nvalue = 4.69'), Text(0.16548495284399126, 0.475, 'longitude <= -177.001\nsquared_error = 1.585\nsamples = 233\nvalue = 4.353'), Text(0.16512481148850924, 0.425, 'squared_error = 0.212\nsamples = 124\nvalue = 4.719'), Text(0.1658450941994733, 0.425, 'squared_error = 2.82\nsamples = 109\nvalue = 3.937'), Text(0.16985166677921085, 0.475, 'longitude <= -172.988\nsquared_error = 0.631\nsamples = 14144\nvalue = 4.695'), Text(0.16656537691043735, 0.425, 'longitude <= -173.018\nsquared_error = 0.653\nsamples = 13375\nvalue = 4.685'), Text(0.1662052355549553, 0.375, 'longitude <= -173.499\nsquared_error = 0.61\nsamples = 13275\nvalue = 4.695'), Text(0.16269385733900557, 0.325, 'longitude <= -173.521\nsquared_error = 0.649\nsamples = 11821\nvalue = 4.677'), Text(0.16233371598352353, 0.275, 'latitude <= -20.001\nsquared_error = 0.604\nsamples = 11717\nvalue = 4.687'), Text(0.16017286785063137, 0.225, 'longitude <= -173.997\nsquared_error = 0.64\nsamples = 6776\nvalue = 4.744'), Text(0.1594525851396673, 0.175, 'longitude <= -174.066\nsquared_error = 0.657\nsamples = 6447\nvalue = 4.734'), Text(0.1590924437841853, 0.125, 'longitude <= -174.496\nsquared_error = 0.604\nsamples = 6346\nvalue = 4.745'), Text(0.15837216107322125, 0.075, 'longitude <= -174.581\nsquared_error = 0.634\nsamples = 5808\nvalue = 4.729'), Text(0.1580120197177392, 0.025, 'squared_error = 0.58\nsamples = 5708\nvalue = 4.741'), Text(0.15873230242870326, 0.025, 'squared_error = 3.213\nsamples = 100\nvalue = 4.016'), Text(0.15981272649514935, 0.075, 'latitude <= -21.643\nsquared_error = 0.241\nsamples = 538\nvalue = 4.914'), Text(0.1594525851396673, 0.025, 'squared_error = 0.12\nsamples = 117\nvalue = 4.77'), Text(0.16017286785063137, 0.025, 'squared_error = 0.267\nsamples = 421\nvalue = 4.955'), Text(0.15981272649514935, 0.125, 'squared_error = 3.534\nsamples = 101\nvalue = 4.066'), Text(0.16089315056159542, 0.175, 'latitude <= -20.98\nsquared_error = 0.288\nsamples = 329\nvalue = 4.929'), Text(0.1605330092061134, 0.125, 'squared_error = 0.299\nsamples = 110\nvalue = 4.81'), Text(0.16125329191707746, 0.125, 'latitude <= -20.459\nsquared_error = 0.271\nsamples = 219\nvalue = 4.989'), Text(0.16089315056159542, 0.075, 'squared_error = 0.311\nsamples = 119\nvalue = 5.029'), Text(0.16161343327255948, 0.075, 'squared_error = 0.22\nsamples = 100\nvalue = 4.942'), Text(0.1644945641164157, 0.225, 'longitude <= -173.947\nsquared_error = 0.544\nsamples = 4941\nvalue = 4.609'), Text(0.16341414004996963, 0.175, 'longitude <= -174.001\nsquared_error = 0.635\nsamples = 3827\nvalue = 4.577'), Text(0.16305399869448758, 0.125, 'latitude <= -15.444\nsquared_error = 0.582\nsamples = 3709\nvalue = 4.591'), Text(0.16233371598352353, 0.075, 'latitude <= -16.512\nsquared_error = 0.565\nsamples = 3196\nvalue = 4.563'), Text(0.16197357462804152, 0.025, 'squared_error = 0.518\nsamples = 2425\nvalue = 4.597'), Text(0.16269385733900557, 0.025, 'squared_error = 0.696\nsamples = 771\nvalue = 4.455'), Text(0.16377428140545164, 0.075, 'latitude <= -15.271\nsquared_error = 0.651\nsamples = 513\nvalue = 4.769'), Text(0.16341414004996963, 0.025, 'squared_error = 0.476\nsamples = 139\nvalue = 4.955'), Text(0.16413442276093368, 0.025, 'squared_error = 0.698\nsamples = 374\nvalue = 4.7'), Text(0.16377428140545164, 0.125, 'squared_error = 2.078\nsamples = 118\nvalue = 4.119'), Text(0.16557498818286176, 0.175, 'latitude <= -15.128\nsquared_error = 0.217\nsamples = 1114\nvalue = 4.723'), Text(0.16485470547189773, 0.125, 'latitude <= -19.13\nsquared_error = 0.233\nsamples = 882\nvalue = 4.754'), Text(0.1644945641164157, 0.075, 'squared_error = 0.219\nsamples = 101\nvalue = 4.877'), Text(0.16521484682737975, 0.075, 'latitude <= -15.303\nsquared_error = 0.233\nsamples = 781\nvalue = 4.738'), Text(0.16485470547189773, 0.025, 'squared_error = 0.204\nsamples = 628\nvalue = 4.712'), Text(0.16557498818286176, 0.025, 'squared_error = 0.335\nsamples = 153\nvalue = 4.848'), Text(0.16629527089382581, 0.125, 'latitude <= -15.035\nsquared_error = 0.136\nsamples = 232\nvalue = 4.602'), Text(0.1659351295383438, 0.075, 'squared_error = 0.132\nsamples = 104\nvalue = 4.628'), Text(0.16665541224930785, 0.075, 'squared_error = 0.138\nsamples = 128\nvalue = 4.581'), Text(0.16305399869448758, 0.275, 'squared_error = 4.518\nsamples = 104\nvalue = 3.602'), Text(0.16971661377090508, 0.325, 'latitude <= -15.73\nsquared_error = 0.271\nsamples = 1454\nvalue = 4.836'), Text(0.16809597767123596, 0.275, 'latitude <= -17.566\nsquared_error = 0.186\nsamples = 751\nvalue = 4.759'), Text(0.16701555360478987, 0.225, 'latitude <= -19.955\nsquared_error = 0.197\nsamples = 349\nvalue = 4.823'), Text(0.16665541224930785, 0.175, 'squared_error = 0.223\nsamples = 105\nvalue = 4.781'), Text(0.1673756949602719, 0.175, 'latitude <= -18.74\nsquared_error = 0.184\nsamples = 244\nvalue = 4.841'), Text(0.16701555360478987, 0.125, 'squared_error = 0.197\nsamples = 103\nvalue = 4.902'), Text(0.16773583631575392, 0.125, 'squared_error = 0.17\nsamples = 141\nvalue = 4.796'), Text(0.16917640173768203, 0.225, 'latitude <= -16.251\nsquared_error = 0.17\nsamples = 402\nvalue = 4.704'), Text(0.16881626038220002, 0.175, 'longitude <= -173.225\nsquared_error = 0.151\nsamples = 239\nvalue = 4.672'), Text(0.16845611902671798, 0.125, 'squared_error = 0.179\nsamples = 139\nvalue = 4.705'), Text(0.16917640173768203, 0.125, 'squared_error = 0.108\nsamples = 100\nvalue = 4.626'), Text(0.16953654309316407, 0.175, 'squared_error = 0.194\nsamples = 163\nvalue = 4.75'), Text(0.1713372498705742, 0.275, 'latitude <= -15.192\nsquared_error = 0.348\nsamples = 703\nvalue = 4.918'), Text(0.17061696715961014, 0.225, 'longitude <= -173.193\nsquared_error = 0.338\nsamples = 469\nvalue = 4.97'), Text(0.17025682580412813, 0.175, 'latitude <= -15.326\nsquared_error = 0.31\nsamples = 329\nvalue = 4.919'), Text(0.16989668444864608, 0.125, 'squared_error = 0.274\nsamples = 177\nvalue = 4.857'), Text(0.17061696715961014, 0.125, 'squared_error = 0.343\nsamples = 152\nvalue = 4.991'), Text(0.17097710851509218, 0.175, 'squared_error = 0.383\nsamples = 140\nvalue = 5.089'), Text(0.17205753258153825, 0.225, 'longitude <= -173.345\nsquared_error = 0.352\nsamples = 234\nvalue = 4.813'), Text(0.17169739122605623, 0.175, 'squared_error = 0.353\nsamples = 101\nvalue = 4.881'), Text(0.1724176739370203, 0.175, 'squared_error = 0.344\nsamples = 133\nvalue = 4.761'), Text(0.16692551826591936, 0.375, 'squared_error = 4.756\nsamples = 100\nvalue = 3.425'), Text(0.17313795664798434, 0.425, 'latitude <= -16.875\nsquared_error = 0.217\nsamples = 769\nvalue = 4.872'), Text(0.17205753258153825, 0.375, 'latitude <= -18.702\nsquared_error = 0.145\nsamples = 323\nvalue = 4.783'), Text(0.17169739122605623, 0.325, 'squared_error = 0.135\nsamples = 101\nvalue = 4.827'), Text(0.1724176739370203, 0.325, 'latitude <= -17.764\nsquared_error = 0.148\nsamples = 222\nvalue = 4.763'), Text(0.17205753258153825, 0.275, 'squared_error = 0.138\nsamples = 100\nvalue = 4.743'), Text(0.1727778152925023, 0.275, 'squared_error = 0.155\nsamples = 122\nvalue = 4.78'), Text(0.1742183807144304, 0.375, 'longitude <= -172.751\nsquared_error = 0.259\nsamples = 446\nvalue = 4.936'), Text(0.1738582393589484, 0.325, 'longitude <= -172.909\nsquared_error = 0.25\nsamples = 275\nvalue = 4.908'), Text(0.17349809800346636, 0.275, 'squared_error = 0.323\nsamples = 100\nvalue = 4.981'), Text(0.1742183807144304, 0.275, 'squared_error = 0.203\nsamples = 175\nvalue = 4.867'), Text(0.17457852206991245, 0.325, 'squared_error = 0.272\nsamples = 171\nvalue = 4.981'), Text(0.18314805748756388, 0.725, 'latitude <= 49.556\nsquared_error = 2.356\nsamples = 12487\nvalue = 2.99'), Text(0.17313795664798434, 0.675, 'latitude <= -10.75\nsquared_error = 0.304\nsamples = 1584\nvalue = 0.068'), Text(0.1727778152925023, 0.625, 'squared_error = 2.548\nsamples = 104\nvalue = 0.654'), Text(0.17349809800346636, 0.625, 'longitude <= -179.572\nsquared_error = 0.121\nsamples = 1480\nvalue = 0.027'), Text(0.17313795664798434, 0.575, 'squared_error = 0.576\nsamples = 106\nvalue = 0.129'), Text(0.1738582393589484, 0.575, 'longitude <= -175.858\nsquared_error = 0.085\nsamples = 1374\nvalue = 0.019'), Text(0.17313795664798434, 0.525, 'latitude <= 41.75\nsquared_error = 0.015\nsamples = 775\nvalue = 0.004'), Text(0.1727778152925023, 0.475, 'squared_error = 0.0\nsamples = 668\nvalue = 0.0'), Text(0.17349809800346636, 0.475, 'squared_error = 0.107\nsamples = 107\nvalue = 0.032'), Text(0.17457852206991245, 0.525, 'longitude <= -174.714\nsquared_error = 0.174\nsamples = 599\nvalue = 0.038'), Text(0.1742183807144304, 0.475, 'longitude <= -175.392\nsquared_error = 0.498\nsamples = 206\nvalue = 0.111'), Text(0.1738582393589484, 0.425, 'squared_error = 0.158\nsamples = 100\nvalue = 0.04'), Text(0.17457852206991245, 0.425, 'squared_error = 0.809\nsamples = 106\nvalue = 0.177'), Text(0.17493866342539446, 0.475, 'squared_error = -0.0\nsamples = 393\nvalue = 0.0'), Text(0.1931581583271434, 0.675, 'latitude <= 53.481\nsquared_error = 1.233\nsamples = 10903\nvalue = 3.414'), Text(0.1838268395345173, 0.625, 'latitude <= 51.001\nsquared_error = 0.951\nsamples = 10542\nvalue = 3.504'), Text(0.17637922884732257, 0.575, 'latitude <= 50.978\nsquared_error = 1.035\nsamples = 1073\nvalue = 3.273'), Text(0.17601908749184056, 0.525, 'latitude <= 50.062\nsquared_error = 0.972\nsamples = 964\nvalue = 3.308'), Text(0.17565894613635852, 0.475, 'squared_error = 1.68\nsamples = 103\nvalue = 2.959'), Text(0.17637922884732257, 0.475, 'latitude <= 50.423\nsquared_error = 0.871\nsamples = 861\nvalue = 3.35'), Text(0.17565894613635852, 0.425, 'longitude <= -177.622\nsquared_error = 0.904\nsamples = 249\nvalue = 3.524'), Text(0.1752988047808765, 0.375, 'squared_error = 0.649\nsamples = 106\nvalue = 3.379'), Text(0.17601908749184056, 0.375, 'squared_error = 1.066\nsamples = 143\nvalue = 3.631'), Text(0.17709951155828663, 0.425, 'latitude <= 50.543\nsquared_error = 0.84\nsamples = 612\nvalue = 3.279'), Text(0.1767393702028046, 0.375, 'squared_error = 1.748\nsamples = 104\nvalue = 2.955'), Text(0.17745965291376867, 0.375, 'longitude <= -177.509\nsquared_error = 0.628\nsamples = 508\nvalue = 3.346'), Text(0.17709951155828663, 0.325, 'squared_error = 0.648\nsamples = 182\nvalue = 3.541'), Text(0.17781979426925068, 0.325, 'longitude <= -173.636\nsquared_error = 0.584\nsamples = 326\nvalue = 3.237'), Text(0.17745965291376867, 0.275, 'latitude <= 50.88\nsquared_error = 0.487\nsamples = 226\nvalue = 3.158'), Text(0.17709951155828663, 0.225, 'squared_error = 0.457\nsamples = 112\nvalue = 3.065'), Text(0.17781979426925068, 0.225, 'squared_error = 0.5\nsamples = 114\nvalue = 3.248'), Text(0.1781799356247327, 0.275, 'squared_error = 0.755\nsamples = 100\nvalue = 3.417'), Text(0.1767393702028046, 0.525, 'squared_error = 1.483\nsamples = 109\nvalue = 2.961'), Text(0.19127445022171202, 0.575, 'latitude <= 51.452\nsquared_error = 0.935\nsamples = 9469\nvalue = 3.531'), Text(0.18149998874558265, 0.525, 'longitude <= -178.85\nsquared_error = 0.935\nsamples = 4143\nvalue = 3.628'), Text(0.1792603596911788, 0.475, 'longitude <= -179.461\nsquared_error = 1.097\nsamples = 812\nvalue = 3.862'), Text(0.17854007698021473, 0.425, 'latitude <= 51.159\nsquared_error = 1.11\nsamples = 302\nvalue = 3.654'), Text(0.1781799356247327, 0.375, 'squared_error = 0.686\nsamples = 121\nvalue = 3.355'), Text(0.17890021833569675, 0.375, 'squared_error = 1.294\nsamples = 181\nvalue = 3.854'), Text(0.17998064240214284, 0.425, 'longitude <= -179.259\nsquared_error = 1.048\nsamples = 510\nvalue = 3.985'), Text(0.1796205010466608, 0.375, 'squared_error = 1.002\nsamples = 148\nvalue = 4.251'), Text(0.18034078375762486, 0.375, 'latitude <= 51.191\nsquared_error = 1.027\nsamples = 362\nvalue = 3.877'), Text(0.17998064240214284, 0.325, 'squared_error = 0.868\nsamples = 146\nvalue = 3.716'), Text(0.1807009251131069, 0.325, 'latitude <= 51.308\nsquared_error = 1.104\nsamples = 216\nvalue = 3.985'), Text(0.18034078375762486, 0.275, 'squared_error = 1.077\nsamples = 116\nvalue = 4.244'), Text(0.1810610664685889, 0.275, 'squared_error = 0.968\nsamples = 100\nvalue = 3.685'), Text(0.1837396177999865, 0.475, 'longitude <= -177.558\nsquared_error = 0.879\nsamples = 3331\nvalue = 3.571'), Text(0.18142120782407095, 0.425, 'latitude <= 51.13\nsquared_error = 0.919\nsamples = 1208\nvalue = 3.476'), Text(0.1810610664685889, 0.375, 'squared_error = 0.962\nsamples = 120\nvalue = 3.764'), Text(0.18178134917955296, 0.375, 'longitude <= -178.479\nsquared_error = 0.904\nsamples = 1088\nvalue = 3.444'), Text(0.18142120782407095, 0.325, 'squared_error = 1.243\nsamples = 175\nvalue = 3.714'), Text(0.182141490535035, 0.325, 'latitude <= 51.41\nsquared_error = 0.823\nsamples = 913\nvalue = 3.392'), Text(0.18178134917955296, 0.275, 'longitude <= -178.312\nsquared_error = 0.765\nsamples = 761\nvalue = 3.352'), Text(0.1808809957908479, 0.225, 'longitude <= -178.4\nsquared_error = 0.478\nsamples = 211\nvalue = 3.209'), Text(0.1805208544353659, 0.175, 'squared_error = 0.456\nsamples = 106\nvalue = 3.143'), Text(0.18124113714632994, 0.175, 'squared_error = 0.491\nsamples = 105\nvalue = 3.276'), Text(0.18268170256825805, 0.225, 'longitude <= -178.013\nsquared_error = 0.865\nsamples = 550\nvalue = 3.407'), Text(0.181961419857294, 0.175, 'latitude <= 51.297\nsquared_error = 0.935\nsamples = 311\nvalue = 3.503'), Text(0.18160127850181196, 0.125, 'squared_error = 1.019\nsamples = 168\nvalue = 3.667'), Text(0.182321561212776, 0.125, 'squared_error = 0.768\nsamples = 143\nvalue = 3.311'), Text(0.1834019852792221, 0.175, 'longitude <= -177.873\nsquared_error = 0.745\nsamples = 239\nvalue = 3.281'), Text(0.18304184392374007, 0.125, 'squared_error = 0.617\nsamples = 103\nvalue = 3.169'), Text(0.18376212663470412, 0.125, 'squared_error = 0.826\nsamples = 136\nvalue = 3.365'), Text(0.18250163189051702, 0.275, 'squared_error = 1.063\nsamples = 152\nvalue = 3.595'), Text(0.18605802777590205, 0.425, 'longitude <= -176.422\nsquared_error = 0.848\nsamples = 2123\nvalue = 3.625'), Text(0.18448240934566817, 0.375, 'latitude <= 51.312\nsquared_error = 0.957\nsamples = 436\nvalue = 3.869'), Text(0.18412226799018616, 0.325, 'latitude <= 51.132\nsquared_error = 0.907\nsamples = 241\nvalue = 4.107'), ...]
plot = seaborn.barplot(y=model_PQ.feature_importances_, x=['latitude', 'longitude'])
Bij het evalueren van dit model komt naar voren wat ik al dacht. De maximale error is namelijk hoger dan die van de Nearest Neighbors model, met een maximale error van 7.11 tussen de voorspelde en werkelijke waarde ten opzichte van een max error van 6.87 van het Nearest Neighbors model. Daarnaast is de rmse ook wat hoger ten opzichte van het Nearest Neighbors model, met een rmse van 0.94 ten opzichte van een rmse van 0.88 van het Nearest Neighbors model. Dit model presteert wel goed, maar het Nearest Neighbors model blijft toch beter op basis van precisie en evaluatie. Laten we kijken hoe het Support Vector Machine het doet.
Prediction_Decision = model_PQ.predict(X_test)
me = max_error(y_test, Prediction_Decision)
print("Max Error:", me)
mse = mean_squared_error(y_test, Prediction_Decision)
rmse = math.sqrt(mse)
print("Root Mean Squared Error:", rmse)
Max Error: 7.116666666666667 Root Mean Squared Error: 0.9407287824931889
Hieronder voer ik preprocessing uit voor het Support Vector Machine. Ik maak hierbij een kleinere dataset met een willekeurige sample van 500.000 rijen, wat ongeveer de helft is van de volledige dataset. Dit heb ik gedaan omdat het enorm lang duurt om met de volledige dataset dit model te gebruiken, maar zoals je hieronder zult zien duurt het ook met deze sample size te lang. Vervolgens split ik de dataset met dezelfde test size en random state.
PQ2 = PQ.sample(50000)
X = PQ2[['latitude', 'longitude']]
y = PQ2['mag']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=100)
print("There are in total", len(X), "observations, of which", len(X_train), "are now in the train set, and", len(X_test), "in the test set.")
There are in total 50000 observations, of which 40000 are now in the train set, and 10000 in the test set.
Ook schaal ik de waarden in de x datasets van de trainings- en testdata. Dit doe ik, omdat het SVR model afhankelijk is van afstanden tussen datapunten. Hierdoor is het voordelig om de onafhankelijke variabelen te schalen om ervoor te zorgen dat ze in hetzelfde bereik zitten. Zonder schaling zouden we de meeste variatie hebben langs de dimensie met het hoogste bereik, wat zou leiden tot een slechter voorspellingsmodel.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
Het laatste model die ik zal controleren of het de baseline kan verslaan is een Support Vector Machine model. Ik had in mijn vorige iteratie gebruik gemaakt van een Random Forest Regressor, maar na nader inzien is een vorm van Decision Trees toch niet het juiste model voor deze dataset. Dit kwam ook naar voren tijdens het gesprek met Bas, waarbij ik achter het idee kwam van Bas, om toch gebruik te maken van een Support Vector Machine, omdat dit model naast het Nearest Neighbor model goed werkt met afstanden, waar mijn dataset op gebaseerd is. Uit de precisie hieronder is te zien dat dit model toch niet het beste model is. Dit model verslaat de baseline namelijk niet en presteerd het slechtst aan de hand van precisie. Bij zowel de sample size van 5.000 en 50.000 presteert dit model met een precisie rond de 30%.
from sklearn.svm import SVR
model_SVR = SVR(kernel = 'rbf')
model_SVR.fit(X_train, y_train)
score_SVR = model_SVR.score(X_test, y_test)
print("Accuracy:", score_SVR)
Accuracy: 0.2985401135543114
import io, math
from sklearn.metrics import max_error
from sklearn.metrics import mean_squared_error
Prediction_SVR = model_SVR.predict(X_test)
me = max_error(y_test, Prediction_SVR)
print("Max Error:", me)
mse = mean_squared_error(y_test, Prediction_SVR)
rmse = math.sqrt(mse)
print("Root Mean Squared Error:", rmse)
Max Error: 6.326814621125474 Root Mean Squared Error: 1.5644826478432021
In deze iteratie heb ik de onderdelen van deze challenge verder uitgebreid en heb ik meer structuur gebracht in hoe dit notebook is opgebouwd. Ik heb dummy data toegevoegd aan de bestaande dataset en ik heb bovenstaande modellen opnieuw uitgevoerd en ge-evalueerd. Uit de twee beschikbare modellen, namelijk Nearest Neighbors en Decision Tree presteerd het Nearest Neighbors model het beste op zowel de precisie, max error en rmse. Hoewel de Decision Tree heel dicht in de buurt komt van de baseline, is de verwerkingstijd van de Nearest Neighbors model toch beter, met een tijd van ongeveer 5,7 seconden ten opzichte van de 7,2 seconden van de Decision Tree. Dit zorgt ervoor dat de applicatie uiteindelijk sneller gegevens kan verwerken en ophalen. Uit de twee modellen kies ik dus het Nearest Neigbors model. Helaas presteert het Support Vector Machine model niet zoals verwacht met een precisie van met een sample size van 50.000. Door deze reden kies ik voor het Nearest Neigbors model voor het voorspellen van de magnitude. Dit model sla ik hieronder op, die ik zal gebruiken in mijn applicatie. Het opslaan doe ik met de joblib module, die ik opsla naar een SAV (savefile) bestand.
import joblib
# Het opslaan van het model
filename = 'KNN-Predictquake.sav'
joblib.dump(model_KNN, filename)